尝试使用Popen从另一个python脚本打开python脚本会抛出Windows错误

时间:2016-04-29 07:49:10

标签: python popen

我正在尝试使用Python 2.7中的Popen从另一个python脚本打开一个python脚本。

这两个脚本是:

child.py :逐个完成5个整数并等待一段时间并打印其正方形

    import time
    for i in range(5):
        value = int(raw_input('Enter an integer: '))
        time.sleep(2)
        print "Its square is ", value*value

parent.py :打开child.py并将5个整数写入其标准输入并打印其标准输出

    import subprocess, time

    # following is the line of interest
    child_program = subprocess.Popen("child.py", 
                                     stdin=subprocess.PIPE,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE)

    for i in range(5):
        child_program.stdin.write(str(i)+"\n")
        child_program.stdin.flush()
        a = child_program.stdout.readline()
        print [a]  # I put it in list just to see exact format

以下是在stackoverflow中看到许多类似问题之后我在parent.py中用于Popen构造函数的第一个参数的其他替换

    "./child.py": Same WindowsError is produced
    <full path>:  Same WindowsError is produced
    ["python", "child.py"]: Did not raise error but opened python (useless)

产生的WindowsError是:

    WindowsError: [Error 193] %1 is not a valid Win32 application

3 个答案:

答案 0 :(得分:0)

首先,您必须指定要作为子流程打开的文件类型

 child_program = subprocess.Popen(['executable','child.py'], 
                                 stdin=subprocess.PIPE,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)

这可以解决您的问题。

答案 1 :(得分:0)

如果你有Python解释器设置来处理* .py文件,那么你可以在你的Popen构造函数中设置shell=True

child_program = subprocess.Popen("child.py",
                                 shell=True,
                                 stdin=subprocess.PIPE,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)

正如其他人所指出的那样,此方法带有安全警告,因此您必须注意您传递给Popen的参数不会被恶意构建(对于例如,如果您从用户输入中获取了一些参数):https://docs.python.org/3/library/subprocess.html#security-considerations

否则,您需要告诉Popen使用Python可执行文件加载文件,如下所示:

import sys

child_program = subprocess.Popen([sys.executable, "child.py"],
                                 stdin=subprocess.PIPE,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE)

在此上下文中,sys.executable将解析为用于启动父脚本的Python二进制文件的完整路径。

答案 2 :(得分:0)

Popen,其中shell=False代表默认CreateProcess代表ShellExecute作为its docs。该API函数只能运行可执行文件(无论其扩展名如何)。

你需要