内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我完全理解我应该在第一次编写正确的脚本,但事实是我有一个脚本根据从命令行传递给它的两个值生成数据文件 - 如下所示:
[sinux1~]: ./sim_gen.py 100 .3
我需要在另一个脚本中调用此脚本,迭代一系列值。我在周围搜索并浏览了所有“你不应该”后,我试过了:
exec(open("./sim_gen.py 100 .3").read())
这似乎不起作用。帮帮我?
让我们分解成碎片:
exec(open("./sim_gen.py 100 .3").read())
这相当于:
f = open("./sim_gen.py 100 .3")
contents = f.read()
exec(contents)
这open
与open
您在阅读文本文件或CSV时使用的相同。您要求"sim_gen.py 100 .3"
在当前目录中命名一个文件。你是否有一个?当然不是。所以open
失败了。
正如您所知,最好的解决方案是重写,sim_gen.py
以便您可以import
调用函数并将参数传递给它。
如果做不到这一点,最干净的答案可能就是将Python脚本作为子进程运行:
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
参数,即使你确实需要它。