执行在不同虚拟环境/ venv下构建的python脚本?

时间:2020-07-23 23:52:10

标签: python virtualenv invoke virtualenvwrapper

如果我要实现的目标不是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"])

这成功地调用了,但是我得到了各种未找到的异常等。我猜这就是原因。

请告诉我是否有更好的方法!

2 个答案:

答案 0 :(得分:2)

您可以这样做:

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)

两种方法都可以正常工作:)

答案 1 :(得分:1)

嘿,这不是一个完整的答案,但这是我的解决方法。 如果您使用pyenv,则可以采用以下方法:

  1. 为每个项目单独创建一个virtualenv。 pyenv virtualenv 3.8 proj1pyenv virtualenv 3.7 proj1或任何python版本。
  2. 在每个目录中使用pyenv local将目录链接到venvs
  3. cd到每个目录,并在每个目录中激活python env。使用pip install将库安装到每个venv。
  4. 现在您应该可以访问使用单独库的不同python可执行文件,例如~/.pyenv/versions/proj1/bin/python
  5. 因此从理论上来说,从proj1代码中您应该可以做到:
import os;
os.system("~/.pyenv/versions/proj2/bin/python ../proj2/main.py")

或类似的东西。 我实际上并没有尝试过,但是我相当确定它可以用于使用单独的库。

这里是pyenv:https://github.com/pyenv/pyenv

明天我不困时我会自己尝试的。