[英]Using a Python subprocess call to invoke a Python script
我有一个 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 。 我在这里错过了什么吗?
如果'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)
也可以工作,但是使用字符串作为调用的输入不是跨平台的,如果你不是构建字符串的那个是危险的,并且如果可能的话通常应该避免。
视窗? Unix的?
Unix需要一个shebang和exec属性才能工作:
#!/usr/bin/env python
作为第一行脚本和:
chmod u+x script.py
在命令行或
call('python script.py'.split())
如前所述。
如果将shell = True参数添加到“call”调用,Windows应该可以工作。
看看这个。
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)
subprocess.call
预计相同的参数subprocess.Popen
-这是一个字符串列表( argv
C语言),而不是一个字符串。
您的子进程很可能尝试使用参数“o”,“m”,“e”,...运行“s”。
如果您使用的是Linux / Unix,则可以完全避免使用call(),而不是执行Python可执行文件及其环境的全新实例。
import os
cpid = os.fork()
if not cpid:
import somescript
os._exit(0)
os.waitpid(cpid, 0)
物有所值。
怎么了?
import sys
from os.path import dirname, abspath
local_dir = abspath(dirname(__file__))
sys.path.append(local_dir)
import somescript
或者更好的是将功能包装在一个函数中,例如baz,然后执行此操作。
import sys
from os.path import dirname, abspath
local_dir = abspath(dirname(__file__))
sys.path.append(local_dir)
import somescript
somescript.baz()
似乎有很多脚本启动python进程或分叉,这是一个要求吗?
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
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()
首先,检查somescript.py
是否可执行,并以#!/usr/bin/python
的行开头。 如果这样做,那么你可以使用subprocess.call('./somescript.py')
。
或者另一个答案指出,你可以做subprocess.call(['python', 'somescript.py'])
。
子进程调用是一个非常有文字意识的系统调用。 它可以用于任何通用进程...因此不知道如何自动处理Python脚本。
尝试
call ('python somescript.py')
如果这不起作用,您可能想尝试一个绝对路径,和/或检查Python脚本的权限......这是一个典型的有趣的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.