从另一个python脚本运行一个python脚本,传入参数
这个问题在这里已经有了答案:
尝试使用os.system
:
os.system("script2.py 1")
execfile
是不同的,因为它被设计为在当前执行上下文中运行一系列Python语句。 这就是为什么sys.argv
不会改变你。
这本质上是错误的。 如果您从另一个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)
我认为这比将所有数据传递到操作系统并返回更合适。 这很愚蠢。
理想情况下,您要运行的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解释器过程,因为没有葡萄干。
上一篇: Run a python script from another python script, passing in args
下一篇: Run a linux system command as a superuser, using a python script