在开始之前,请先了解我的环境:通过miniconda,macOS 10.13.3安装的python 2.7.14。
问题
我正在尝试analyze.py在python中编写一个数据处理管道(称为),该管道会调用几个不同的程序。这些程序之一,EMAN2使用其自己的python环境运行(位于~/EMAN2/bin/python)。在命令行中,对eman2的调用可能类似于以下内容:
~/EMAN2/bin/e2buildstacks.py
其中,e2buildstacks.py使用#!/Users//EMAN2/bin/python文件顶部的标准类型公式指定了自己的python环境(请注意,有许多不同的.py文件要运行,我仅使用一个名称作为示例)。
在python中,我正在使用subprocess.Popen构造这些调用。一个非常简单的示例是:
import subprocess
stacks_cmd = '/Users//EMAN2/bin/e2buildstacks.py '
process = subprocess.Popen(stacks_cmd, shell=True, stdout=subprocess.PIPE)
stacks_output, stacks_error = process.communicate()
为了简单起见,在这里我替换了实际的args和用户名。
如果这就是我正在做的一切,那么它将正常工作。我可以从命令行运行python analyze.py,它可以毫无问题地运行EMAN2。
但是,此管道已包装在GUI(基于wxpython)中。因此,我必须使用它pythonw来运行我的程序。当我尝试做时:
pythonw analyze.py
它无法正确运行EMAN2脚本,出现错误:
Traceback (most recent call last):
File "/Users//EMAN2/bin/e2buildstacks.py", line 34, in
from EMAN2 import *
ImportError: No module named EMAN2
这向我表明它正在使用我的miniconda python而不是~/EMAN2/bin/python运行脚本。
(注意:如果有人使用EMAN2,我可以为您提供完整的参数列表和输入文件。但是请放心,这不是问题,我可以从命令行运行我正在使用的命令)
我尝试过的
我尝试了几种不同的方法来解决此问题。最简单的是指定要在命令中使用的python:
import subprocess
stacks_cmd = '/Users//EMAN2/bin/python /Users//EMAN2/bin/e2buildstacks.py '
process = subprocess.Popen(stacks_cmd, shell=True, stdout=subprocess.PIPE)
stacks_output, stacks_error = process.communicate()
那是行不通的,并以相同的错误失败。
我尝试在shell = False模式下使用Popen
import subprocess
stacks_cmd = ['/Users//EMAN2/bin/python', '/Users//EMAN2/bin/e2buildstacks.py', ]
process = subprocess.Popen(stacks_cmd, shell=False, stdout=subprocess.PIPE)
stacks_output, stacks_error = process.communicate()
要么
import subprocess
stacks_cmd = ['/Users//EMAN2/bin/e2buildstacks.py', ]
process = subprocess.Popen(stacks_cmd, shell=False, stdout=subprocess.PIPE)
stacks_output, stacks_error = process.communicate()
两者均因相同的错误而失败。
我试过指定可执行文件:
import subprocess
stacks_cmd = ['/Users//EMAN2/bin/e2buildstacks.py', ]
process = subprocess.Popen(stacks_cmd, shell=False, stdout=subprocess.PIPE, executable='/Users//EMAN2/bin/python')
stacks_output, stacks_error = process.communicate()
这给出了一个不同的错误:
Unknown option: --
usage: /Users//EMAN2/bin/e2buildstacks.py [option] ... [-c cmd | -m mod | file | -] [arg] ...
Try `python -h' for more information.
这让我觉得参数以某种方式没有被正确地传递给脚本,而是被传递给了python本身(我可能不太了解可执行文件的设置)。
我尝试设置环境变量:
import os
my_env = os.environ.copy()
my_env['PATH'] = '/Users//EMAN2/bin:'+my_env['PATH']
my_env['PYTHONPATH'] = '/Users//EMAN2/bin'
然后在上述任何命令中将其传递给subprocess.Popenenv=my_env。这将失败,并显示相同的错误。
在这一点上,我几乎没有想法,希望有人可以提供帮助。同样,这仅在pythonw而不发生python。
我读过的东西在寻找解决方案
我在stackoverflow上找不到任何与这个问题完全匹配的东西。我看过的东西:
从未成功回答。
问题不在于我使用的是哪个python / pythonw,两者都来自miniconda。
这与我的问题完全相反,因此用处不大。
这表明miniconda pythonw可能会引起各种问题,但是并没有直接提供解决方案(强烈建议不要使用其他版本的python)。
这些使我试图修改环境变量。
最后说明
更改正在使用的python发行版本是可能的,但绝不是理想的解决方案。我正在写一些可以在几种不同环境(包括尚未经过测试的linux和Windows)中运行的文件,这些文件可以由不是我的人运行,因此我需要一个更安全的解决方案。
人们可以提供的任何帮助都将不胜感激。
解决方案
暂无回答