需要从另一个Python脚本调用需要命令行参数的python脚本

时间:2018-07-09 20:40:40

标签: python scripting python-3.6

我完全理解我应该是第一次编写脚本,但是事实是我有一个脚本,该脚本基于从命令行传递给它的两个值来生成数据文件,如下所示:

 [sinux1~]: ./sim_gen.py 100 .3

我需要从另一个脚本中调用此脚本,并在一系列值上进行迭代。我浏览了所有“您不应该”的内容,然后进行了搜索:

 exec(open("./sim_gen.py 100 .3").read())

这似乎不起作用。 帮助吗?

1 个答案:

答案 0 :(得分:2)

让我们把它分解成碎片:

exec(open("./sim_gen.py 100 .3").read())

这等效于:

f = open("./sim_gen.py 100 .3")
contents = f.read()
exec(contents)

open与您用于读取文本文件或CSV的open相同。您正在当前目录中请求名为"sim_gen.py 100 .3"的文件。你是否有一个?当然不是。因此open失败。


众所周知,最好的解决方案是重写sim_gen.py,以便您可以import并调用函数并将参数传递给它。


否则,最干净的答案可能只是run the Python script as a subprocess

import subprocess
import sys
subprocess.run([sys.executable, "./sim_gen.py", "100", ".3"])

请注意,这实际上与从shell运行脚本时所执行的操作相同,因此,如果在此运行正常,那么在这里几乎可以确定。


如果由于某种原因确实需要exec,则需要做一些非常hacky的操作,并临时更改该脚本代码的argv

import sys
_argv = sys.argv
try:
    sys.argv = ["./sim_gen.py", "100", ".3"]
    with open("./sim_gen.py 100 .3"):
        exec(f.read())
finally:
    sys.argv = _argv

尽管实际上,除非运行该命令的目的是静默修改您自己模块的全局变量或类似内容,否则您(a)几乎可以肯定不需要exec,并且(b)希望传递一个显式变量globals参数,即使您确实需要它也是如此。