使用Python子进程调用来调用Python脚本

问题描述 投票:0回答:10

我有一个Python脚本需要调用同一目录中的另一个Python脚本。我这样做了:

from subprocess import call
call('somescript.py')

我收到以下错误:

call('somescript.py')
File "/usr/lib/python2.6/subprocess.py", line 480, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child

raise child_exception
OSError: [Errno 2] No such file or directory

我在同一个文件夹中有脚本 somescript.py 。我在这里错过了什么吗?

python subprocess
10个回答
61
投票

如果“somescript.py”不是您通常可以直接从命令行执行的东西(即,

$: somescript.py
有效),那么您不能使用call直接调用它。

请记住,Popen 的工作方式是第一个参数是它执行的程序,其余的参数是传递给该程序的参数。在这种情况下,该程序实际上是 python,而不是您的脚本。因此,以下内容将按您的预期工作:

subprocess.call(['python', 'somescript.py', somescript_arg1, somescript_val1,...])

这会正确调用 Python 解释器并告诉它使用给定的参数执行脚本。

请注意,这与上面的建议不同:

subprocess.call(['python somescript.py'])

它将尝试执行名为 python somscript.py 的程序,该程序显然不存在。

call('python somescript.py', shell=True)

也可以工作,但是使用字符串作为调用的输入不是跨平台的,如果您不是构建字符串的人,则很危险,并且通常应尽可能避免。


8
投票

Windows? Unix?

Unix 将需要 shebang 和 exec 属性才能工作:

#!/usr/bin/env python

作为脚本的第一行并且:

chmod u+x script.py

在命令行或

call('python script.py'.split())

如前所述。

如果您将 shell=True 参数添加到“call”调用中,Windows 应该可以工作。


4
投票

看看这个。

from subprocess import call 
with open('directory_of_logfile/logfile.txt', 'w') as f:
   call(['python', 'directory_of_called_python_file/called_python_file.py'], stdout=f)

4
投票
import subprocess
command = 'home/project/python_files/run_file.py {} {} {}'.format(
        arg1, arg2, arg3) # if you want to pass any arguments
p = subprocess.Popen(
        [command],
        shell=True,
        stdin=None,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        close_fds=True)
out, err = p.communicate()

3
投票

subprocess.call
需要与
subprocess.Popen
相同的参数 - 即字符串列表(C 中的
argv
)而不是单个字符串。

您的子进程很可能尝试使用参数“o”,“m”,“e”,...运行“s”


2
投票

如果您使用的是 Linux/Unix,您可以完全避免 call() 并且不执行 Python 可执行文件及其环境的全新实例。

import os

cpid = os.fork()
if not cpid:
    import somescript
    os._exit(0)

os.waitpid(cpid, 0)

它的价值。


1
投票

有什么问题

import sys
from os.path import dirname, abspath

local_dir = abspath(dirname(__file__))
sys.path.append(local_dir)

import somescript

或者更好地将功能包装在函数中,例如巴兹,然后这样做。

import sys
from os.path import dirname, abspath

local_dir = abspath(dirname(__file__))
sys.path.append(local_dir)

import somescript
somescript.baz()

似乎有很多脚本启动 python 进程或分叉,这是一个要求吗?


0
投票

首先,检查

somescript.py
是否可执行,并以类似于
#!/usr/bin/python
的方式开始。 如果完成了,那么您可以使用
subprocess.call('./somescript.py')

或者正如另一个答案指出的那样,你可以这样做

subprocess.call(['python', 'somescript.py'])


0
投票
def main(argv):
    host = argv[0]
    type = argv[1]
    val = argv[2]

    ping = subprocess.Popen(['python ftp.py %s %s %s'%(host,type,val)],stdout = subprocess.PIPE,stderr = subprocess.PIPE,shell=True)
    out = ping.communicate()[0]
    output = str(out)
    print output

0
投票

子进程调用是一个非常字面意义的系统调用。它可以用于任何通用过程...因此不知道如何自动处理 Python 脚本。

尝试

call ('python somescript.py')

如果这不起作用,您可能想尝试绝对路径,和/或检查 Python 脚本的权限......典型的有趣的东西。

© www.soinside.com 2019 - 2024. All rights reserved.