복붙노트

[PYTHON] 파이썬에서 큰 따옴표 셸 명령을 subprocess.Popen ()에 전달 하시겠습니까?

PYTHON

파이썬에서 큰 따옴표 셸 명령을 subprocess.Popen ()에 전달 하시겠습니까?

필자는 ffmpeg에 대한 "concat : file1 | file2"인수 주위의 명령 줄에서 리터럴 이중 따옴표로만 작동하는 셸에서 작동하는 명령을 전달하려고했습니다.

그러나 나는 subprocess.Popen ()으로 파이썬에서이 작업을 할 수 없다. 누구나 어떻게 하위 프로세스에 따옴표를 전달하는지 알 수 있습니다 .Popen?

다음은 코드입니다.

command = "ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4"

output,error = subprocess.Popen(command, universal_newlines=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()

내가 이것을 할 때, ffmpeg는 concat segement 주변의 따옴표 이외의 다른 방법으로 그것을 취하지 않을 것이다. 이 행을 subprocess.Popen 명령에 성공적으로 전달하는 방법이 있습니까?

해결법

  1. ==============================

    1.따옴표 붙은 문자열 버전이 아닌 호출 목록 양식을 사용하는 것이 좋습니다.

    따옴표 붙은 문자열 버전이 아닌 호출 목록 양식을 사용하는 것이 좋습니다.

    command = ["ffmpeg", "-i", "concat:1.ts|2.ts", "-vcodec", "copy",
               "-acodec", "copy", "temp.mp4"]
    output,error  = subprocess.Popen(
                        command, universal_newlines=True,
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
    

    이것은 최종 프로세스에 전달 될 정확한 매개 변수 세트를보다 정확하게 나타내고 쉘 인용 부호를 사용하여 혼란을 피할 필요가 없습니다.

    즉, 일반 문자열 버전을 절대적으로 사용하려면 다른 따옴표 (및 shell = True)를 사용하십시오.

    command = 'ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4'
    output,error  = subprocess.Popen(
                        command, universal_newlines=True, shell=True,
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
    
  2. ==============================

    2.이것은 파이썬에서 작동합니다. 2.7.3 stderr을 stdout에 파이프하는 명령은 이전 버전의 파이썬에서 변경되었습니다 :

    이것은 파이썬에서 작동합니다. 2.7.3 stderr을 stdout에 파이프하는 명령은 이전 버전의 파이썬에서 변경되었습니다 :

    이것을 test.py라는 파일에 넣으십시오.

    #!/usr/bin/python
    import subprocess
    
    command = 'php -r "echo gethostname();"'
    p = subprocess.Popen(command, universal_newlines=True, shell=True, 
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    text = p.stdout.read()
    retcode = p.wait()
    print text
    

    그것을 불러내 라.

    python test.py
    

    내 호스트 이름을 인쇄합니다. apollo는 다음과 같습니다.

    apollo
    

    하위 프로세스 설명서 : http://docs.python.org/2/library/subprocess.html을 읽으십시오.

  3. ==============================

    3."전체 패턴"주위에 작은 따옴표를 사용하여 자동으로 double을 이스케이프하거나 명시 적으로 "큰 따옴표 \"를 이스케이프합니다. 귀하의 문제는 Popen과 관련이 없습니다.

    "전체 패턴"주위에 작은 따옴표를 사용하여 자동으로 double을 이스케이프하거나 명시 적으로 "큰 따옴표 \"를 이스케이프합니다. 귀하의 문제는 Popen과 관련이 없습니다.

    단지 기록을 위해서, 나는 Popen에 전달 된 목록 기반 명령에 특히 문제가있었습니다. 이것은 Windows에서 glob 패턴 (즉, 수락 된 대답에서 제안 된 것이 무엇인지) 주위에 적절한 큰 따옴표를 유지하지 않을 것입니다. Popen에 전달하기 전에 목록을 ''.join (cmd)로 문자열에 결합하면 문제가 해결됩니다.

  4. ==============================

    4.나는 비교적 복잡한 문제를 다루면서 유사한 문제를 해결해왔다. ssh를 통한 명령. 또한 multipel 큰 따옴표 및 작은 따옴표가 있습니다. 때문에 파이썬, ssh, powershell 등을 통해 명령을 파이프했습니다.

    나는 비교적 복잡한 문제를 다루면서 유사한 문제를 해결해왔다. ssh를 통한 명령. 또한 multipel 큰 따옴표 및 작은 따옴표가 있습니다. 때문에 파이썬, ssh, powershell 등을 통해 명령을 파이프했습니다.

    대신 명령을 쉘 스크립트로 변환하고 subprocess.call / Popen / run을 통해 쉘 스크립트를 실행하면 이러한 문제는 사라집니다.

    따라서 Windows 또는 Linux 또는 Mac 중 어디에 있는지에 따라 쉘 스크립트에서 (script.sh 또는 script.bat)

    ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4
    

    그럼 너는 달릴 수있어.

    import subprocess; subprocess.call(`./script.sh`; shell=True)
    

    작은 따옴표 등에 대해 걱정할 필요없이

  5. ==============================

    5.또한 공백이 포함 된 문자열 인수로 고민하고 shell = True를 사용하지 않으려 고합니다.

    또한 공백이 포함 된 문자열 인수로 고민하고 shell = True를 사용하지 않으려 고합니다.

    해결책은 안쪽 문자열에 큰 따옴표를 사용하는 것이 었습니다.

    args = ['salt', '-G', 'environment:DEV', 'grains.setvals', '{"man_version": "man-dev-2.3"}']
    
    try:
        p = subprocess.Popen(args, stdin=subprocess.PIPE
                                 , stdout=subprocess.PIPE
                                 , stderr=subprocess.PIPE
                            )
        (stdin,stderr) = p.communicate()
    except (subprocess.CalledProcessError, OSError ) as err:
        exit(1)
    if p.returncode != 0:
        print("Failure in returncode of command:")
    
  6. from https://stackoverflow.com/questions/14928860/passing-double-quote-shell-commands-in-python-to-subprocess-popen by cc-by-sa and MIT license