我完全理解我应该在第一次编写正确的脚本,但事实是我有一个脚本,它根据从命令行传递给它的两个值生成一个数据文件-如下所示:
[sinux1~]: ./sim_gen.py 100 .3
我需要从另一个脚本中调用这个脚本,遍历一系列值。我到处搜索,在浏览完所有的“你不应该”之后,我试着:
exec(open("./sim_gen.py 100 .3").read())
这似乎行不通。帮助?
发布于 2018-07-10 04:45:29
让我们将其分解为几个部分:
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中运行脚本时所做的事情相同,因此,如果在那里是OK的,那么在这里几乎肯定是OK的。
如果出于某种原因您确实需要使用exec
,那么您需要做一些非常麻烦的事情,并临时更改脚本代码的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
参数,即使您确实需要它。
https://stackoverflow.com/questions/51253681
复制相似问题