代码之家  ›  专栏  ›  技术社区  ›  dbr

使用子进程在Windows上运行Python脚本

  •  35
  • dbr  · 技术社区  · 17 年前

    有没有一种在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
    

    monkut's 议论 :用例不清楚。为什么要使用子流程来运行python脚本?是否有什么东西阻止您导入脚本并调用必要的函数?

    我正在编写一个快速脚本来测试Python命令行工具的总体功能(在各种平台上进行测试)。基本上,它必须在一个临时文件夹中创建一组文件,在此文件夹上运行脚本,并检查文件是否正确重命名。

    我本可以导入脚本并调用函数,但由于它依赖于 sys.argv 和使用 sys.exit() ,我需要做一些像。。

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

    当然,更好的方法是以更易于单元测试的方式编写脚本,但脚本基本上是“完成”的,我正在进行最后一批测试,然后再进行“1.0”版本(之后我将进行重写/重构,这将更整洁、更易测试)

    基本上,在找到 sys.executable 变量我会把它写成一个shell脚本,但那不是跨平台的。最后的脚本可以找到 here

    7 回复  |  直到 9 年前
        1
  •  70
  •   johnthagen Matthew Scharley    7 年前

    刚找到 sys.executable -当前Python可执行文件的完整路径,可用于运行脚本(而不是依赖shbang,后者显然在Windows上不起作用)

    import sys
    import subprocess
    
    theproc = subprocess.Popen([sys.executable, "myscript.py"])
    theproc.communicate()
    
        2
  •  25
  •   Roman Starkov    17 年前

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

    这说明 subprocess 使用操作系统外壳打开脚本,并处理可以在cmd.exe中运行的任何内容。

    此外,这将搜索“myscript.py”的路径,这可能是需要的。

        3
  •  7
  •   ib. Evgeny Shavlyugin    15 年前

    subprocess.Popen(cmd, ..., shell=True) 工作起来很有魅力。在窗户上 .py 文件扩展名是可识别的,因此调用Python来处理它(在*NIX上,这只是通常的shebang)。路径环境控制是否看到对象。所以第一个参数 Popen 只是脚本的名称 .

    subprocess.Popen(['myscript.py', 'arg1', ...], ..., shell=True)
    
        4
  •  5
  •   viksit    17 年前

    看起来windows试图使用自己的EXE框架运行脚本,而不是像这样调用它

    python /the/script.py
    

    尝试

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

        5
  •  3
  •   user285594 user285594    12 年前

    例如,要使用命令提示符或批处理文件执行以下命令,我们可以使用以下命令:

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

    与Python一样,我们可以这样做:

    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)
    
        6
  •  2
  •   user59634 user59634    17 年前

    您正在使用依赖于平台的路径名分隔符。Windows使用“\”而Unix使用“/”。

        7
  •  1
  •   Robbie    17 年前

    在子流程中的windows上运行python脚本时,应在脚本名称前面使用python。尝试:

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