如果我想要实现的目标不是 Pythonic,我深表歉意 - 我最近转向了该语言。
我有一个结构如下的项目目录:
root
--proj1
----venv
----main.py
--proj2
----venv
----main.py
proj1 和 proj2 都在自己的虚拟环境下运行。我试图从 proj1/main.py 调用 proj2/main.py,同时在其自己的 venv 下执行 proj2/main.py。我试过了:
import subprocess
s2_out = subprocess.check_output([sys.executable, r"..\proj2\__main__.py", "arg"])
这调用成功,但我收到各种未找到的异常等。我猜这就是原因。
如果有更好的方法请告诉我!
你可以这样做:
import subprocess
subprocess.call(["python_interpreter location (python.exe)", "python file"])
所以你可以这样做:
import subprocess
subprocess.call(["../proj2/bin/python.exe", "proj2/main.py"])
对于 Mac OS 和 Linux,venv 的
python
解释器路径将是 folder/bin/python.exe
,或者在您的情况下为 ../proj2/bin/python.exe
。
对于 Windows,venv 的
python
解释器路径将是 folder/scripts/python.exe
。
您可能需要包含完整路径。
subprocess.call
,如果您需要输出:
import subprocess
output = subprocess.call("%s %s" %("../proj2/bin/python.exe", "proj2/main.py"))
print(output)
两种方式都可以正常工作:)
嘿,这不是一个完整的答案,但这是我的处理方法。 如果您使用
pyenv
那么这将是方法:
pyenv virtualenv 3.8 proj1
和 pyenv virtualenv 3.7 proj1
或任何 python 版本。pyenv local
将目录链接到 venvscd
到每个目录,并且每个目录中的 python env 都应该激活。使用 pip install
将库安装到每个 venv。~/.pyenv/versions/proj1/bin/python
import os;
os.system("~/.pyenv/versions/proj2/bin/python ../proj2/main.py")
或者类似的东西。 我实际上没有尝试过这个,但我相当确定它可以用于使用单独的库。
这是 pyenv:https://github.com/pyenv/pyenv
明天不困的时候我自己试试。
这是一个完全合理的用例。当尝试在工作流程中使用多个工具时,每个工具可能有不同的依赖关系..而且我不认为 python 能很好地支持这一点。我通常通过 bash/files 缝合多个工具,但如果你想从 python 中调用,你必须做类似的事情。
env = dict(os.environ)
env['PYTHONPATH'] = ... path to the library in the env...
args = [pathwithinenv/python, fullpath to python code, arg1,arg2]
p = Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env)