ESP*_*ach 5 python environment virtual subprocess
我有一个 Python 3.6 脚本,它使用子进程调用第三方工具。
main_script.py:
#!/usr/bin/env python
import subprocess
result = subprocess.run(['third-party-tool', '-arg1'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
问题是,main_script.py必须从虚拟环境中运行,并且third-party-tool必须从任何虚拟环境中运行。
我对此了解不多third-party-tool,只知道它在我的道路上。当我有一个活动的虚拟环境时调用它会导致它堵塞并稍后抛出异常。我不知道它是否使用默认的 python 二进制文件,或者它启动自己的虚拟环境并在那里执行操作。它不是一个 Python 脚本,但显然以某种方式调用一个脚本。
如何告诉子进程退出虚拟环境并在默认 shell 环境中运行命令?
我研究过几个类似的问题:
third-party-tool不是Python脚本(我相信它是bash)。从子流程的文档中:
\n\nhttps://docs.python.org/3/library/subprocess.html
\n\n接受的参数是
\n\nsubprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None,\n capture_output=False, shell=False, cwd=None, timeout=None, check=False,\n encoding=None, errors=None, text=None, env=None, universal_newlines=None)\nRun Code Online (Sandbox Code Playgroud)\n\n尤其,
\n\n\n\n\n如果 env 不为 None,则它必须是定义新进程的环境变量的映射;这些用于代替继承当前 process\xe2\x80\x99 环境的默认行为。它直接传递给 Popen。
\n
因此,传递一个空字典env={}(从空环境开始)并使用bash --login(作为登录 shell 运行,读取环境默认值)应该可以解决问题。
subprocess.run([\'bash\', \'--login\', \'-c\', \'/full/path/to/third-party-tool\', \'-arg1\'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env={})\nRun Code Online (Sandbox Code Playgroud)\n