需要从另一个python脚本调用使用命令行参数的python脚本
我完全理解我应该在第一次编写正确的脚本,但事实是我有一个脚本,它根据从命令行传递给它的两个值生成数据文件,如下所示:需要从另一个python脚本调用使用命令行参数的python脚本,python,scripting,python-3.6,Python,Scripting,Python 3.6,我完全理解我应该在第一次编写正确的脚本,但事实是我有一个脚本,它根据从命令行传递给它的两个值生成数据文件,如下所示: [sinux1~]: ./sim_gen.py 100 .3 我需要从另一个脚本中调用这个脚本,迭代一系列值。我四处搜索,在浏览了所有“你不应该”之后,我试着: exec(open("./sim_gen.py 100 .3").read()) 这似乎不起作用。 帮助?让我们将其分解为几个部分: exec(open("./sim_gen.py 100 .3").read()
[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
与读取文本文件或CSV时使用的open
相同。您要求在当前目录中提供名为“sim\u gen.py 100.3”的文件。有吗?当然不是。因此,打开
失败
正如您所知,最好的解决方案是重写
sim_gen.py
,这样您就可以导入它并调用函数并将参数传递给它
如果做不到这一点,最清晰的答案可能是:
请注意,这实际上与从shell运行脚本时所做的操作相同,因此,如果在那里没有问题,那么在这里几乎肯定没有问题
如果出于某种原因确实需要执行exec
,则需要执行一些真正的黑客操作,并临时更改该脚本的代码:
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)几乎肯定不需要执行,并且(b)即使确实需要,也希望传递显式的全局参数。让我们将其分解为几部分:
exec(open("./sim_gen.py 100 .3").read())
这相当于:
f = open("./sim_gen.py 100 .3")
contents = f.read()
exec(contents)
该open
与读取文本文件或CSV时使用的open
相同。您要求在当前目录中提供名为“sim\u gen.py 100.3”
的文件。有吗?当然不是。因此,打开
失败
正如您所知,最好的解决方案是重写
sim_gen.py
,这样您就可以导入它并调用函数并将参数传递给它
如果做不到这一点,最清晰的答案可能是:
请注意,这实际上与从shell运行脚本时所做的操作相同,因此,如果在那里没有问题,那么在这里几乎肯定没有问题
如果出于某种原因确实需要执行exec
,则需要执行一些真正的黑客操作,并临时更改该脚本的代码:
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
参数,即使您确实需要它。print(subprocess.Popen([“python”,“/sim_gen.py”,100,0.3])。communicate())
@JoranBeasley您可能想要sys.executable
而不是python
(如果不是,您可能希望信任shbang)。此外,参数必须是字符串。另外,为什么要构造一个Popen
来与通信,而不是仅仅使用run
(或者,对于较旧的Python,check\u output
或类似的工具)?所有有效点。。。只是因为我以前一直在做这件事,check\u output
。。。所以这是一种习惯:P但是你是对的print(subprocess.Popen([“python”,“/sim_gen.py”,100,0.3]).communicate())
@JoranBeasley你可能想要sys.executable
,而不是python
(如果不是,你可能想要信任shbang)。此外,参数必须是字符串。另外,为什么要构造一个Popen
来与通信,而不是仅仅使用run
(或者,对于较旧的Python,check\u output
或类似的工具)?所有有效点。。。只是因为我以前一直在做这件事,check\u output
。。。所以这是一种习惯的力量:P但你是对的,这不仅非常有效,而且你解释得非常好。非常感谢。这段代码实际上只需要运行一次。我计划回到amd重构,无论如何都要正确地编写它。谢谢。这不仅很好,而且你解释得非常好。非常感谢。这段代码实际上只需要运行一次。我计划回到amd重构,无论如何都要正确地编写它。非常感谢。