이 답변터미널의 명령줄에서 여러 줄의 Python 코드 조각을 실행하는 방법을 설명합니다. 나는 중첩된 들여쓰기를 사용하더라도 쉘 스크립트에서 대답이 잘 작동한다는 것을 알았습니다.
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <<EOF | python -
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
인쇄:
0
hello
hello
1
hello
hello
2
hello
hello
그러나 쉘 스크립트와 Python 코드 조각 간에 변수를 공유하는 데 문제가 있습니다.
Bash 스크립트에서 Python 첨자의 출력을 수집하는 방법은 무엇입니까? (예: 와 같은 변수에서
$output
).bash 변수(예:
$some_text
)를 Python 스크립트에 어떻게 전달합니까?
답변1
Python 변수 가져오기
EOF
( 토큰이 인용되지 않은 경우 ) python
텍스트가 구분 기호에서 표준 입력으로 전달되기 전에 변수 대체가 발생하므로 변수를 스크립트에 직접 던질 수 있습니다.
python - <<EOF
some_text = "$some_text"
EOF
만약 some_text
그렇다면 test
, 파이썬은 그것을 보게 될 것입니다 some_text = "test"
. 하지만 이는 코드 주입 취약점으로 간주될 수 있다는 점에 유의하세요. 예를 들어, some_text
was 인 경우 Python은 다음을 확인합니다."; import os; os.system("evil-command"); x = "
some_text = ""; import os; os.system("evil-command"); x = ""
그리고 그 사악한 명령을 실행하세요.
수정 없이 Python 코드를 스크립트로 직접 가져오려면 변수를 내보낼 수 있습니다.
export some_text
os.environ
그것을 검색하는 데 사용되었습니다 .
some_text = os.environ['some_text']
이것은 더 똑똑하고 안전한 접근 방식입니다.
Python에서 출력 가져오기
명령 대체를 사용하여 스크립트의 출력을 수집할 수 있습니다.
output=$(
python - <<EOF
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)
(후행 줄 바꿈은 제거됩니다.)
답변2
귀하의 접근 방식의 문제점은 내장된 Python 스크립트가 더 이상 원래 표준 입력에 액세스할 수 없다는 것입니다(표준 입력이 ... 자체이기 때문입니다).
이것이 문제라면 다음과 같이 작성할 수 있습니다.
python -c '
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
'
또는 Python 스크립트에 작은따옴표가 포함될 수 있는 경우:
python -c "$(cat << 'EOF'
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)"
또는:
python <(cat << 'EOF'
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
)
답변3
파일 이름으로 대시를 사용하십시오.
ruby - a b <<'END'
puts ARGV.join(",")
END
python - a b <<'END'
import sys
print ",".join(sys.argv[1:])
END
sys.argv[1:]
이것이 Python에서 하는 것이 올바른 일인지 모르겠습니다 . -e/-c의 경우 --를 사용하여 인수의 끝을 지정할 수 있습니다.
set -- -a -b -c
ruby -e 'puts ARGV.join(",")' -- "$@"
python -c 'import sys; print ",".join(sys.argv[2:])' -- "$@"
출력 캡처 및 STDERR 리디렉션:
x=$(ruby <<'END' 2> /dev/null
puts "a"
abort "b"
END
)
답변4
1) Python에서 파일에 변수 할당을 작성한 다음 bash 스크립트에서 파일을 가져올 수 있습니다.
2) 귀하의 단어(EOF)가 인용되지 않았기 때문에 여기 문서의 모든 줄은 매개변수 확장의 대상입니다. 이를 사용하여 콘텐츠를 Python 스크립트에 전달할 수 있습니다.