2009-05-26 44 views
34

在Windows/Linux/OS X上是否有一种简单的方法来运行Python脚本?在Windows上使用子进程运行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 comment: The use case isn't clear. Why use subprocess to run a python script? Is there something preventing you from importing the script and calling the necessary function?

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

我可以导入脚本和调用的函数,而是因为它依赖于sys.argv并使用sys.exit(),我会需要做这样的事情..

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

另外,我想捕捉到标准输出和stderr进行调试,以防止出现问题。

当然,更好的方法是以更多单元测试的方式编写脚本,但脚本基本上是“完成”的,我在做一个“1.0”版本之前做了最后一批测试(之后我打算做一个重写/重组,这将是更加整洁和更可测试的)

基本上,在找到sys.executable变量后,简单地运行脚本作为一个进程就容易多了。我会把它写成一个shell脚本,但这不会是跨平台的。最终的脚本,可以发现here

+2

用例不清楚。为什么使用子进程来运行python脚本?有没有办法阻止你导入脚本并调用必要的函数? – monkut 2009-05-27 01:26:05

+0

从python运行nodejs模块时遇到同样的问题。 subprocess.call([r'.. \ nodejs \ npm'],shell = True)解决了这个问题。 – Stefan 2012-11-20 14:00:15

回答

52

刚刚发现sys.executable - 的完整路径当前的Python可执行程序,它可以用来运行脚本(而不是依靠shbang,这显然不工作在Windows上)

import sys 
import subprocess 

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

你可以使用`subprocess.check_call([sys.executable,“myscript.py”])`代替。 – jfs 2012-11-22 16:44:20

1

当您在子进程中的窗口上运行python脚本时,应该在脚本名称前面使用python。尝试:

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

它看起来像Windows会尝试使用它自己的EXE框架运行的脚本,而不是这样称呼它

​​

尝试,

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

编辑: “蟒蛇” 将需要在你的路上。

+0

python.org Windows安装程序似乎没有把PATH中的“python”命令,我认为它会有.exe后缀(这将打破其他平台) – dbr 2009-05-26 21:38:33

+0

啊,我想这个.exe会打破东西,是的.. – viksit 2009-05-27 07:22:05

+0

嗯,看来你可以在Windows上排除.exe,只要它在PATH中,但你必须手动添加Python到它 – dbr 2009-05-27 15:01:20

2

您正在使用与平台相关的路径名分隔符。 Windows使用“\”,Unix使用“/”。

20

如何:

import sys 
import subprocess 

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

这告诉subprocess使用OS外壳打开你的脚本,并适用于任何你可以输入cmd.exe只运行。

此外,这将搜索PATH的“myscript.py” - 这可能是可取的。

5

subprocess.Popen(cmd, ..., shell=True)工程就像一个魅力。在Windows上,.py文件扩展名被识别,所以Python被调用来处理它(在* NIX中只是通常的shebang)。路径环境控制是否看到事物。所以Popen的第一个参数是只是脚本的名称。

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

例如,执行与命令提示符或批处理文件之后,我们可以用这个:

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) 
相关问题