【问题标题】:Error setting env thru subprocess.call to run a python script on a remote linux machine通过 subprocess.call 设置环境以在远程 linux 机器上运行 python 脚本时出错
【发布时间】:2012-10-23 15:05:26
【问题描述】:

我在 Windows 机器上运行 python 脚本来调用远程 linux 机器上的另一个 python 脚本。我正在使用带有 ssh 的 subprocess.call 来执行此操作,如下所示: subprocess.call('ssh -i <identify file> username@hostname python <script_on_linux_machine>') 这很好用。

但是,如果我想设置一些环境变量,如下所示: subprocess.call('ssh -i &lt;identify file&gt; username@hostname python &lt;script_on_linux_machine&gt;', env={key1:value1}) 失败了。 我收到以下错误: ssh_connect: getnameinfo failed ssh: connect to host <hostname> port 22: Operation not permitted 255

我尝试将 ssh 命令拆分为列表并传递。没有帮助。 我尝试通过subprocess.call() 运行其他“本地”(Windows)命令并尝试设置环境。它工作正常。 我尝试在远程 linux 机器上运行其他命令(例如ls)。同样,subprocess.call() 工作正常,只要我不尝试设置环境。

我做错了什么?我可以在远程机器上为 python 脚本设置环境吗?任何帮助将不胜感激。

【问题讨论】:

    标签: python ssh subprocess env


    【解决方案1】:

    要在远程端设置环境,您需要在远程端进行调用。尝试编写和上传执行此环境设置的包装脚本,例如

    import subprocess
    import sys
    
    
    args = sys.argv[1:]
    env = dict(zip(args[::2], args[1::2]))
    
    subprocess.call(['python', 'script.py'], env=env)
    

    现在您只需在原始通话中传递此信息,例如

    subprocess.call('ssh -i <identify file> username@hostname '
                    'python <script_on_linux_machine> %s %s' % (key, value))
    

    或者一些更可扩展的方法将 dict 转换为所需的格式。

    【讨论】:

    • 感谢您的回复。但是,我想设置的环境变量只有在运行时才知道——当我在 Windows 机器上运行脚本时。因此,我还需要在运行时将这些环境变量传递给在远程机器上运行的脚本。
    • 谢谢。是的,这让事情变得清晰起来。所以,如果我理解正确,我现在应该制作两个subprocess.calls - 一个用于 setEnv.py,另一个用于我要执行的实际脚本。第一次通话中设置的env 是否会反映在第二次通话中?我可以尝试验证它,但我需要等到星期一。因此,问题。
    • 这个想法是环境通过命令行参数传递给包装脚本,然后为真正的脚本设置环境。
    • 知道了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2015-11-17
    • 2012-09-30
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多