在Anaconda环境中使用子流程

时间:2018-08-13 09:58:22

标签: python subprocess anaconda

我使用Python 3.6.6 :: Anaconda,Inc。

我尝试使用子进程来调用其他python脚本。

subprocess.run("python -V", shell=True)

我尝试了这段代码,但结果是

Python 2.7.12

我的本​​地python被捕获

我也尝试过

subprocess.run("bash -c 'source /home/hclee/anaconda3/envs/calamari/lib/python3.6/venv/scripts/common/activate
/home/hclee/anaconda3/envs/calamari && python -V && source deactivate'", shell=True)

但是我得到了相同的结果

2 个答案:

答案 0 :(得分:1)

在运行代码之前,先在Linux中运行source activate root或在Windows中运行activate root来激活环境。

如果这对您没有帮助,请尝试进行快速而肮脏的修复,例如:

subprocess.run('bash -c "source activate root; python -V"', shell=True)

您需要调用bash的原因是python的运行不会调用bash环境,而是另一个受约束更多且不包含source的环境,因此这里我们需要调用bash ...但是如前所述,如果您需要此命令,则说明您正在执行某些特殊操作,或者您的环境有问题...

不需要停用,它不会执行任何操作,因为运行它的外壳会被破坏...

答案 1 :(得分:0)

我不认为在每次let teamData = this.filteredData.flatMap( team => team.SPRINTS.map( sprint => ({ TEAMNAME: team.TEAMNAME, TEAMGROUP: team.TEAMGROUP, ...sprint }) ) ); 代码调用中都购买conda env是个好主意。

相反,您可以找到当前源环境的subprocess目录,然后从那里获取二进制文件的完整路径。然后在要呼叫它们时将它们传递给bin

subprocess

打印的结果表明,子进程正在使用conda环境中的二进制文件,而不是基本(默认)env文件中的二进制文件。

import os
import sys
import subprocess

# what conda env am I in (e.g., where is my Python process from)?
ENVBIN = sys.exec_prefix

# what binaries am I looking for that are installed in this env?
BIN1 = os.path.join(ENVBIN, "bin", "ipython")
BIN2 = os.path.join(ENVBIN, "bin", "python")
BIN3 = os.path.join(ENVBIN, "bin", "aws")

# let's make sure they exist, no typos.
for bin in (BIN1, BIN2, BIN3):
    assert os.path.exists(bin), "missing binary {} in env {}".format(bin, ENVBIN)

# then use their full paths when making subprocess calls
for bin in (BIN1, BIN2, BIN3):
    cmd = ["which", bin]
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    print(proc.communicate()[0].decode())