Python调用不需要虚拟环境的子进程

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 环境中运行命令?

我研究过几个类似的问题:

nul*_*ser 4

从子流程的文档中:

\n\n

https://docs.python.org/3/library/subprocess.html

\n\n

接受的参数是

\n\n
subprocess.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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

尤其,

\n\n
\n

如果 env 不为 None,则它必须是定义新进程的环境变量的映射;这些用于代替继承当前 process\xe2\x80\x99 环境的默认行为。它直接传递给 Popen。

\n
\n\n

因此,传递一个空字典env={}(从空环境开始)并使用bash --login(作为登录 shell 运行,读取环境默认值)应该可以解决问题。

\n\n
subprocess.run([\'bash\', \'--login\', \'-c\', \'/full/path/to/third-party-tool\', \'-arg1\'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env={})\n
Run Code Online (Sandbox Code Playgroud)\n