【发布时间】:2019-02-20 16:35:28
【问题描述】:
我正在使用subprocess.Popen 从我安装的应用程序中调用外部 Python 脚本,使用 PyInstaller 捆绑。
这个命令的格式是这样的:
subprocess.Popen(["/usr/bin/python", "/path/to/exe/SDK.py"],
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
我已经在 Windows 和 MacOS 上成功地测试了这个 - 两者都可以运行外部脚本。但是,在其他 Posix 操作系统上,我收到以下错误:
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
ImportError: No module named site
现在,我意识到以前有人问过这个问题,通常归结为 PYTHONHOME 的值不正确。但是,如果我以类似于以下格式运行命令:
PYTHONHOME=/usr /usr/bin/python /path/to/exe/SDK.py
我在日志中没有发现错误,但脚本 SDK.py 没有执行。
因此证明这不是我的脚本的问题;我在机器上安装了我自己的 Python 版本 - 完成此操作后,脚本成功执行。我对/usr/bin/python 和/home/vagrant/Python-2.7.15/python 都进行了测试,无需在子进程命令中指定PYTHONHOME。
但是,我仍然需要允许用户使用内置的操作系统版本的 Python 执行 SDK.py 脚本。
为此,我尝试了以下其他方法:
- 在
subprocess.Popen调用中使用sys.executable来执行 SDK.py。
(其值为:/opt/program_name/lib/program_name)
-
通过显式设置环境强制
PYTHONPATH&PYTHONHOME为空:import os env = os.environ.copy() env['PYTHONHOME'] = '' env['PYTHONPATH'] = '' subprocess.Popen(["/usr/bin/python", "/path/to/exe/SDK.py"], env=env)
谁能解释我如何从这样的外部子进程调用 Python 的系统版本?
编辑: 以详细模式调用 Python 时的输出(来自 CLI):
>>> from sys import executable
>>> executable
'/usr/bin/python'
>>> import _csv
# trying _csv.so
# trying _csvmodule.so
# trying _csv.py
# trying _csv.pyc
# trying /usr/lib64/python2.7/_csv.so
# trying /usr/lib64/python2.7/_csvmodule.so
# trying /usr/lib64/python2.7/_csv.py
# trying /usr/lib64/python2.7/_csv.pyc
# trying /usr/lib64/python2.7/plat-linux2/_csv.so
# trying /usr/lib64/python2.7/plat-linux2/_csvmodule.so
# trying /usr/lib64/python2.7/plat-linux2/_csv.py
# trying /usr/lib64/python2.7/plat-linux2/_csv.pyc
# trying /usr/lib64/python2.7/lib-dynload/_csv.so
dlopen("/usr/lib64/python2.7/lib-dynload/_csv.so", 2);
import _csv # dynamically loaded from /usr/lib64/python2.7/lib-dynload/_csv.so
【问题讨论】:
-
你的 PYTHONHOME 最初的价值是多少?而且你尝试的路径不正确,路径组件需要用冒号隔开,而不是空格。
-
@markus 最初,在一个新的虚拟机上,每当我执行
echo $PYTHONHOME时,它都会给出一个空行。所以我认为它没有设置。 -
路径不对,是指我指定
PYTHONHOME=/usr/的那个吗? -
是的,那个。但我才意识到我误读了那句话。但仅 /usr 的 PYTHONHOME 值很可能不正确。
-
我想我是在使用这个 SO 评论作为将
PYTHONHOME设置为/usr/的指针:stackoverflow.com/a/36173084
标签: python linux subprocess popen pythonpath