代码之家  ›  专栏  ›  技术社区  ›  Gern Blanston

从另一个Python脚本运行Python脚本,传入参数[duplicate]

  •  264
  • Gern Blanston  · 技术社区  · 14 年前

    例如,我将运行我的第一个脚本,它将遍历一个值列表(0,1,2,3),并将这些值传递给第二个脚本 script2.py 0 然后 script2.py 1 等等。

    我发现 Stack Overflow question 1186789 这是一个类似的问题,但是ars的答案调用一个函数,当我想运行整个脚本时,不仅仅是一个函数,balpha的答案调用脚本,但是没有参数。我把它改成了下面这样的测试:

    execfile("script2.py 1")
    

    sys.argv 在script2.py中,它是对第一个脚本“['C:\script1.py']的原始命令调用。

    我真的不想更改原始脚本(在我的示例中是script2.py),因为我不拥有它。

    我想一定有办法做到这一点;我只是不知道你是怎么做到的。

    7 回复  |  直到 6 年前
        1
  •  355
  •   Greg Hewgill    14 年前

    尝试使用 os.system :

    os.system("script2.py 1")
    

    execfile 现在的 执行上下文。这就是为什么 sys.argv 没有为你改变。

        2
  •  119
  •   Katriel    14 年前

    这本来就是错误的做法。如果从另一个Python脚本运行Python脚本,则应通过Python而不是通过操作系统进行通信:

    import script1
    

    在一个理想的世界里,你将能够调用里面的函数 script1 直接:

    for i in range(whatever):
        script1.some_function(i)
    

    如果有必要,你可以 sys.argv . 有一种简洁的方法可以使用上下文管理器来确保您不会进行任何永久性的更改。

    import contextlib
    @contextlib.contextmanager
    def redirect_argv(num):
        sys._argv = sys.argv[:]
        sys.argv=[str(num)]
        yield
        sys.argv = sys._argv
    
    with redirect_argv(1):
        print(sys.argv)
    

    我认为这比把你所有的数据传给操作系统和传回来更好;那太傻了。

        3
  •  106
  •   kindall    12 年前

    理想情况下,您要运行的Python脚本将在接近结尾时使用如下代码进行设置:

    def main(arg1, arg2, etc):
        # do whatever the script does
    
    
    if __name__ == "__main__":
        main(sys.argv[1], sys.argv[2], sys.argv[3])
    

    如果 从命令行调用模块,它解析命令行选项,然后调用另一个函数, main() ,做实际工作。(实际参数会有所不同,解析可能会更复杂。)

    但是,如果您想从另一个Python脚本调用这样的脚本,您可以 import modulename.main() 直接,而不是通过操作系统。

    os.system 可以,但这是一种迂回(读作“slow”)的方法,因为每次都要启动一个全新的Python解释器进程。

        4
  •  46
  •   Medhat    9 年前

    import subprocess
    cmd = 'python script.py'
    
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
    out, err = p.communicate() 
    result = out.split('\n')
    for lin in result:
        if not lin.startswith('#'):
            print(lin)
    

    根据文件 subprocess模块允许您生成新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码。本模块旨在取代几个较旧的模块和功能:

    os.system
    os.spawn*
    os.popen*
    popen2.*
    commands.*
    

    使用communicate()而不是。标准写入, .标准读取或者。标准阅读避免由于任何其他操作系统管道缓冲区填满并阻塞子进程而导致死锁。 Read Here

        5
  •  45
  •   Chris Adams    14 年前

    子流程模块:
    http://docs.python.org/dev/library/subprocess.html#using-the-subprocess-module

    import subprocess
    subprocess.Popen("script2.py 1", shell=True)
    

    有了它,您还可以重定向stdin、stdout和stderr。

        6
  •  33
  •   Duncan Jones    11 年前
    import subprocess
    subprocess.call(" python script2.py 1", shell=True)