从另一个Python脚本运行一个Python脚本,传入参数
我想从另一个Python脚本运行一个Python脚本。 我想要像使用命令行一样传递variables。
例如,我将运行我的第一个脚本,它将遍历值列表(0,1,2,3)并将其传递给第二个脚本script2.py 0
然后script2.py 1
等。
我发现SO 1186789这是一个类似的问题,但阿尔斯的答案调用函数,因为我想运行整个脚本不只是一个函数,和balpha的答案调用脚本,但没有参数。 我将其改为如下所示的testing:
execfile("script2.py 1")
但它不能正确接受variables。 当我打印出script2.py中的sys.argv
,它是对第一个脚本“['C:\ script1.py']”的原始命令调用。
我真的不想改变原来的脚本(即我的例子中的script2.py),因为我不拥有它。
我认为必须有办法做到这一点,我只是困惑你如何做到这一点。
尝试使用os.system
:
os.system("script2.py 1")
execfile
是不同的,因为它被devise为在当前执行上下文中运行一系列Python语句。 这就是为什么sys.argv
没有改变。
这本质上是错误的。 如果您从另一个Python脚本运行Python脚本,则应该通过Python而不是通过操作系统进行通信:
import script1
在理想的世界中,您将能够直接在script1
调用一个函数:
for i in range(whatever): script1.some_function(i)
如果有必要,你可以破解sys.argv
。 使用上下文pipe理器可以很好地完成这个任务,以确保您不会做出任何永久更改。
import contextlib @contextlib.contextmanager def redirect_argv(num): sys._argv = sys.argv[:] sys.argv=[str(num)] yield sys.argv = sys._argv with redirect_argv(1): print(sys.argv)
我认为这比将所有数据传递到操作系统并返回更可取, 那简直是愚蠢的
理想情况下,您要运行的Python脚本将在接近结束时使用类似下面的代码进行设置:
def main(arg1, arg2, etc): # do whatever the script does if __name__ == "__main__": main(sys.argv[1], sys.argv[2], sys.argv[3])
换句话说, 如果从命令行调用该模块,它将parsing命令行选项,然后调用另一个函数main()
来执行实际的工作。 (实际的参数会有所不同,parsing可能会涉及更多。)
但是,如果您想从另一个Python脚本调用这样的脚本,则可以直接import
它并直接调用modulename.main()
,而不是通过操作系统。
os.system
可以工作,但是这是一个迂回的(读“慢”)方法,因为你每次都是在开始一个全新的Python解释器过程,而不是每次都是葡萄干。
SubProcess模块:
http://docs.python.org/dev/library/subprocess.html#using-the-subprocess-module
import subprocess subprocess.Popen("script2.py 1", shell=True)
有了这个,你也可以redirectstdin,stdout和stderr。
我认为好的做法可能是这样的;
import subprocess cmd = 'python script.py' p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) out, err = p.communicate() result = out.split('\n') for lin in result: if not lin.startswith('#'): print(lin)
根据文档subprocess模块允许你产生新的进程,连接到他们的input/输出/错误pipe道,并获得他们的返回代码。 这个模块打算取代几个较旧的模块和function:
os.system os.spawn* os.popen* popen2.* commands.*
使用通讯()而不是.stdin.write,.stdout.read或.stderr.read来避免由于任何其他OSpipe道缓冲区填满和阻塞subprocess而导致的死锁。 阅读这里
import subprocess subprocess.call(" python script2.py 1", shell=True)
如果os.system对你来说不够强大,那就是subprocess模块 。