调用子进程会出错

时间:2013-09-23 07:44:59

标签: python python-2.7

我写过以下2个程序,

# TempHello.py
def sayHello():
    print 'Hello World !'
sayHello()

# Subprocess.py
import subprocess

if __name__ == '__main__':
    print 'Calling other program'
    child = subprocess.Popen( "./TempHello.py" , shell=True)
    print subprocess.check_output()
    print 'Calling other program completed'

当我尝试运行Subprocess.py程序时,它会产生以下错误,

    Calling other program
    ./TempHello.py: 2: ./TempHello.py: Syntax error: "(" unexpected
Traceback (most recent call last):
    File "/usr/mandar/AnuntaTech/eclipse_workspace/BackupManager/Subprocess.py", line 7, in <module>
        print subprocess.check_output()
    File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
        process = Popen(stdout=PIPE, *popenargs, **kwargs)
TypeError: __init__() takes at least 2 arguments (2 given)

我无法弄清楚如何解决这个问题。请帮忙。

2 个答案:

答案 0 :(得分:3)

问题是Popen正在尝试执行TempHello.py,就好像它是一个shell可执行文件,而实际上它是一个Python脚本。最简单的解决方案是修复Subprocess.py,如下所示:

import subprocess

if __name__ == '__main__':
    print 'Calling other program'
    child = subprocess.Popen( "python TempHello.py" , shell=True)
    print subprocess.check_output()
    print 'Calling other program completed'

实际上,您需要调用Python可执行文件并使其运行您的脚本。

在* nix平台上(因此,不包括Windows),您还可以使用shebang指定要使用的解释器,如下所示:

#! /usr/bin/env python
def sayHello():
    print 'Hello World !'
sayHello()

或者

#! /usr/bin/python
def sayHello():
    print 'Hello World !'
sayHello()

并使用chmod u+x TempHello.py使脚本可执行。

顺便说一句,我建议你采用不同的方法来生成Python脚本,如果这是你的目的:看一下multiprocess模块。

答案 1 :(得分:2)

您正在运行TempHello.py作为程序。但它只是python源代码。 如何将这一行放在开头:

#!/usr/bin/env python

并运行

chmod u+x TempHello.py

在运行Subprocess.py

之前