从另一个 Python 脚本运行 Python 脚本,传递参数[重复]
- 2025-01-09 08:46:00
- admin 原创
- 121
问题描述:
我想从另一个 Python 脚本运行一个 Python 脚本。我想像使用命令行一样传递变量。
例如,我将运行我的第一个脚本,该脚本将遍历值列表(0,1,2,3),script2.py 0
然后将其传递给第二个脚本script2.py 1
,等等。
我发现Stack Overflow 问题 1186789是一个类似的问题,但 ars 的答案调用了一个函数,而我想运行整个脚本,而不仅仅是一个函数,而 balpha 的答案调用了脚本,但没有参数。我将其更改为以下内容作为测试:
execfile("script2.py 1")
但它不能正确接受变量。当我打印出sys.argv
script2.py 中的时,它是对第一个脚本“['C:\script1.py']”的原始命令调用。
我不太想改变原始脚本(即我的示例中的 script2.py),因为我并不拥有它。
我想一定有办法做到这一点;我只是不明白你是怎么做到的。
解决方案 1:
尝试使用os.system
:
os.system("script2.py 1")
execfile
有所不同,因为它旨在在当前执行上下文中运行一系列 Python 语句。这就是为什么sys.argv
对你来说没有改变。
解决方案 2:
理想情况下,您要运行的 Python 脚本将在结尾处设置如下代码:
def main(arg1, arg2, etc):
# do whatever the script does
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2], sys.argv[3])
换句话说,如果从命令行调用模块,它会解析命令行选项,然后调用另一个函数main()
来执行实际工作。(实际参数会有所不同,解析可能会更复杂。)
但是,如果您想从另一个 Python 脚本调用这样的脚本,您可以简单地直接import
调用它modulename.main()
,而不必通过操作系统。
os.system
可以工作,但是这是迂回(读作“缓慢”)的方法,因为每次你都要启动一个全新的 Python 解释器进程而没有任何效果。
解决方案 3:
这本质上是错误的做法。如果你正在从另一个 Python 脚本运行 Python 脚本,则应该通过 Python 而不是通过操作系统进行通信:
import script1
在理想情况下,您将能够script1
直接调用内部函数:
for i in range(whatever):
script1.some_function(i)
如果有必要,你可以破解sys.argv
。有一个巧妙的方法可以使用上下文管理器来确保你不会做出任何永久性的更改。
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)
我认为这比将所有数据传递到操作系统并返回要好;这太愚蠢了。
解决方案 4:
我认为好的做法可能是这样的;
import subprocess
cmd = 'python script.py'
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
out, err = p.communicate()
result = out.split('
')
for lin in result:
if not lin.startswith('#'):
print(lin)
根据文档,子进程模块允许您生成新进程,连接到其输入/输出/错误管道,并获取其返回代码。此模块旨在替换几个较旧的模块和功能:
os.system
os.spawn*
os.popen*
popen2.*
commands.*
使用communication()而不是.stdin.write、.stdout.read或.stderr.read来避免由于任何其他OS管道缓冲区填满并阻塞子进程而导致死锁。
阅读此处
解决方案 5:
子进程模块:
http://docs.python.org/dev/library/subprocess.html#using-the-subprocess-module
import subprocess
subprocess.Popen("script2.py 1", shell=True)
通过这个,您还可以重定向 stdin、stdout 和 stderr。
解决方案 6:
import subprocess
subprocess.call(" python script2.py 1", shell=True)
扫码咨询,免费领取项目管理大礼包!