代码之家  ›  专栏  ›  技术社区  ›  Sinux1

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

  •  0
  • Sinux1  · 技术社区  · 6 年前

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

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

    我需要从另一个脚本中调用这个脚本,遍历一系列值。我四处寻找,在浏览了所有“你不应该”之后,我试着:

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

    但这似乎行不通。 帮助

    1 回复  |  直到 6 年前
        1
  •  2
  •   abarnert    6 年前

    让我们把它分解成碎片:

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

    这相当于:

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

    那个 open 是一样的 打开 例如,您用于读取文本文件或csv。你要的是一个名为 "sim_gen.py 100 .3" 在当前目录中。有吗?当然不是。所以 打开 失败。


    最好的解决方案是,正如你已经知道的,重写 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 出于某种原因,你需要做一些非常老套的事情,暂时改变一下 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)几乎肯定不需要 执行官 ,和(b)要传递显式 globals 即使你真的需要争论。