【问题标题】:Executing python script built under different virtual environment/venv?执行在不同虚拟环境/venv下构建的python脚本?
【发布时间】:2020-07-23 23:52:10
【问题描述】:

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

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

如果有更好的方法请告诉我!

【问题讨论】:

  • 你有没有机会使用pyenv?如果您使用pyenv,我知道该怎么做。
  • @PeacefulJames 不-但请详细说明,如果有帮助,我愿意采用它:)
  • 您需要 2 个 venv 是否有最重要的原因?除非您正确设置,否则您将有相当不可靠的行为。即,如果您激活 venv1,您应该能够导入 proj2.main,因为配置正确。其他任何东西都在沙子上建造。然而,这样做也不是微不足道的,这就是为什么我犹豫是否认为你的配置是一个很好的开始路径。

标签: python virtualenv invoke virtualenvwrapper


【解决方案1】:

你可以这样做:

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)

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

【讨论】:

  • 如果需要我详细说明,请告诉我。
  • 对于 venv,python.exe 应该在脚本中。
  • 我想在 Linux/Mac 下是 path/to/venv/bin/python,在 Windows 下是 path/to/venv/Scripts/python.exe(如果我没记错的话)。但基本上这也是我建议的答案。
  • 工作得很好,我没有意识到我可以指定解释器。谢谢:)
【解决方案2】:

嘿,这不是一个完整的答案,而是我将如何处理它。 如果您使用pyenv,那么这就是方法:

  1. 为每个项目创建一个单独的 virtualenv。 pyenv virtualenv 3.8 proj1pyenv virtualenv 3.7 proj1 或任何 python 版本。
  2. 在每个目录中使用pyenv local 将目录链接到venvs
  3. cd 到每个目录,并且在每个目录中都应该激活 python 环境。使用 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

明天不困的时候自己试试。

【讨论】:

  • 谢谢,我正在设置 pyenv,但使用了简单的解决方案 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2021-12-04
  • 2020-06-21
  • 2019-04-21
  • 2020-01-15
  • 2023-02-22
相关资源
最近更新 更多