启动pythonw进程_pythonw子进程无法调用其他版本的python

在开始之前,请先了解我的环境:通过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)中运行的文件,这些文件可以由不是我的人运行,因此我需要一个更安全的解决方案。

人们可以提供的任何帮助都将不胜感激。

解决方案

暂无回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值