복붙노트

[PYTHON] 하위 프로세스를 사용하여 Windows에서 Python 스크립트 실행

PYTHON

하위 프로세스를 사용하여 Windows에서 Python 스크립트 실행

Windows / Linux / OS X에서 Python 스크립트를 실행할 수있는 간단한 방법이 있습니까?

후자의 두 가지는 subprocess.Popen ( "/ the / script.py")이 작동하지만 Windows에서 다음과 같은 오류가 발생합니다.

Traceback (most recent call last):
  File "test_functional.py", line 91, in test_functional
    log = tvnamerifiy(tmp)
  File "test_functional.py", line 49, in tvnamerifiy
    stdout = PIPE
  File "C:\Python26\lib\subprocess.py", line 595, in __init__
    errread, errwrite)
  File "C:\Python26\lib\subprocess.py", line 804, in _execute_child
    startupinfo)
WindowsError: [Error 193] %1 is not a valid Win32 application

파이썬 커맨드 라인 도구의 전반적인 기능을 테스트하기위한 빠른 스크립트를 작성했습니다 (다양한 플랫폼에서 테스트하기 위해). 기본적으로 임시 폴더에 여러 개의 파일을 만들고 스크립트를 실행하여 파일의 이름이 올바르게 변경되었는지 확인해야했습니다.

스크립트를 가져 와서 함수를 호출 할 수는 있지만 sys.argv를 사용하고 sys.exit ()을 사용하기 때문에 필자는 다음과 같은 작업을 수행해야합니다.

import sys
import tvnamer
sys.argv.append("-b", "/the/folder")
try:
    tvnamer.main()
except BaseException, errormsg:
    print type(errormsg)

또한, 뭔가 잘못되었을 때 디버깅을 위해 stdout 및 stderr를 캡처하려고했습니다.

물론 더 좋은 방법은 단위 테스트 할 수있는 방법으로 스크립트를 작성하는 것이지만 스크립트는 기본적으로 "완료"되고 "1.0"릴리스를 수행하기 전에 마지막 테스트 일괄 처리를 수행합니다 (이후에는 재구성 / 재구성을 수행하는데, 이것은 훨씬 더 깔끔하고 더 테스트 가능할 것입니다)

기본적으로 sys.executable 변수를 찾은 후 스크립트를 프로세스로 실행하는 것이 훨씬 쉽습니다. 필자는 쉘 스크립트로 작성했지만 크로스 플랫폼이 아니었을 것입니다. 최종 스크립트는 여기에서 찾을 수 있습니다.

해결법

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

    1.sys.executable - 스크립트를 실행하는 데 사용할 수있는 현재 Python 실행 파일의 전체 경로 (shbang에 의존하는 대신 Windows에서는 작동하지 않음)를 발견했습니다.

    sys.executable - 스크립트를 실행하는 데 사용할 수있는 현재 Python 실행 파일의 전체 경로 (shbang에 의존하는 대신 Windows에서는 작동하지 않음)를 발견했습니다.

    import sys
    import subprocess
    
    theproc = subprocess.Popen([sys.executable, "myscript.py"])
    theproc.communicate()
    
  2. ==============================

    2.이것은 어떤가요:

    이것은 어떤가요:

    import sys
    import subprocess
    
    theproc = subprocess.Popen("myscript.py", shell = True)
    theproc.communicate()                   # ^^^^^^^^^^^^
    

    이것은 하위 프로세스에게 OS 쉘을 사용하여 스크립트를 열고 cmd.exe에서 방금 실행할 수있는 모든 작업을 수행하도록 지시합니다.

    또한 PATH에서 "myscript.py"를 검색합니다. 이는 바람직 할 수 있습니다.

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

    3.예 subprocess.Popen (cmd, ..., shell = True)은 매력처럼 작동합니다. Windows에서는 .py 파일 확장자가 인식되므로 파이썬은 그것을 처리하기 위해 호출됩니다 (* NIX의 경우 보통의 shebang). 경로 환경은 사물이 보이는지 여부를 제어합니다. 따라서 Popen에 대한 첫 번째 주장은 스크립트의 이름 일뿐입니다.

    예 subprocess.Popen (cmd, ..., shell = True)은 매력처럼 작동합니다. Windows에서는 .py 파일 확장자가 인식되므로 파이썬은 그것을 처리하기 위해 호출됩니다 (* NIX의 경우 보통의 shebang). 경로 환경은 사물이 보이는지 여부를 제어합니다. 따라서 Popen에 대한 첫 번째 주장은 스크립트의 이름 일뿐입니다.

    subprocess.Popen(['myscript.py', 'arg1', ...], ..., shell=True)
    
  4. ==============================

    4.창문처럼 보이는 대신 자체 EXE 프레임 워크를 사용하여 스크립트를 실행하려고합니다.

    창문처럼 보이는 대신 자체 EXE 프레임 워크를 사용하여 스크립트를 실행하려고합니다.

    python /the/script.py
    

    시험,

    subprocess.Popen(["python", "/the/script.py"])
    

    편집 : "파이썬"당신의 경로에 있어야합니다.

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

    5.플랫폼에 따라 경로 이름 분리 기호를 사용하고 있습니다. Windows는 "\"를 사용하고 Unix는 "/"를 사용합니다.

    플랫폼에 따라 경로 이름 분리 기호를 사용하고 있습니다. Windows는 "\"를 사용하고 Unix는 "/"를 사용합니다.

  6. ==============================

    6.서브 프로세스에서 파이썬 스크립트를 윈도우에서 실행할 때 스크립트 이름 앞에 파이썬을 사용해야합니다. 시험:

    서브 프로세스에서 파이썬 스크립트를 윈도우에서 실행할 때 스크립트 이름 앞에 파이썬을 사용해야합니다. 시험:

    process = subprocess.Popen("python /the/script.py")
    
  7. ==============================

    7.예를 들어 명령 프롬프트 나 BATCH 파일로 다음을 실행하려면 다음을 사용하면됩니다.

    예를 들어 명령 프롬프트 나 BATCH 파일로 다음을 실행하려면 다음을 사용하면됩니다.

    C:\Python27\python.exe "C:\Program files(x86)\dev_appserver.py" --host 0.0.0.0 --post 8080 "C:\blabla\"
    

    파이썬과 같은 일을 할 수 있습니다.

    subprocess.Popen(['C:/Python27/python.exe', 'C:\\Program files(x86)\\dev_appserver.py', '--host', '0.0.0.0', '--port', '8080', 'C:\\blabla'], shell=True)
    

    또는

    subprocess.Popen(['C:/Python27/python.exe', 'C:/Program files(x86)/dev_appserver.py', '--host', '0.0.0.0', '--port', '8080', 'C:/blabla'], shell=True)
    
  8. from https://stackoverflow.com/questions/912830/using-subprocess-to-run-python-script-on-windows by cc-by-sa and MIT license