subprocess.Popen에 변수 전달: 목록의 인수와 작동하지 않는 이유
subprocess.Popen을 사용하여 다른 Python을 호출하는 경우 스크립트를 사용하면 변수에 저장된 인수를 전달하는 데 문제가 발생할 수 있습니다. 이는 다음과 같은 명령을 실행하려고 할 때 발생할 수 있습니다.
p = subprocess.Popen( ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"], shell=True, stdout=subprocess.PIPE )
문제:
shell=True를 사용하기 때문에 문제가 발생합니다. 이 플래그가 활성화되면 Popen()에 전달된 인수는 Unix 시스템에서 다르게 처리됩니다. 셸은 인수를 단일 명령 문자열로 해석하므로 예기치 않은 동작이 발생할 수 있습니다.
해결책:
이 문제를 해결하려면 사용을 중단하세요. 쉘=True. 대신 인수 목록을 직접 만들어 Popen()에 전달하세요. 예는 다음과 같습니다.
import sys from subprocess import Popen, PIPE # Populate list of arguments args = ["mytool.py"] for opt, optname in zip("-a -x -p".split(), "address port pass".split()): args.extend([opt, str(servers[server][optname])]) args.extend("some additional command".split()) # Run script p = Popen([sys.executable or 'python'] + args, stdout=PIPE) # ... Use p.stdout here p.stdout.close() p.wait()
shell=True를 제거하고 인수 목록을 수동으로 구성하면 변수가 호출된 스크립트에 올바르게 전달되도록 할 수 있습니다.
보안 주의:
외부 입력과 관련된 명령에 shell=True를 전달하면 보안 문제가 발생할 수 있다는 점에 유의하는 것이 중요합니다. 하위 프로세스 문서에 언급된 위험. 스크립트에서 사용자 제공 입력을 처리하는 경우 잠재적인 취약점을 방지하려면 shell=True를 사용하지 않는 것이 좋습니다.
위 내용은 `shell=True`일 때 `subprocess.Popen`이 목록의 변수 인수와 함께 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!