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

问题描述 投票:0回答:3

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

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

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

python virtualenv invoke virtualenvwrapper
3个回答
4
投票

你可以这样做:

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
投票

嘿,这不是一个完整的答案,但这是我的处理方法。 如果您使用

pyenv
那么这将是方法:

  1. 为每个项目创建一个单独的virtualenv。
    pyenv virtualenv 3.8 proj1
    pyenv 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

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


0
投票

这是一个完全合理的用例。当尝试在工作流程中使用多个工具时,每个工具可能有不同的依赖关系..而且我不认为 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)
© www.soinside.com 2019 - 2024. All rights reserved.