首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修正“致命的Python错误: Py_Initialize:无法初始化sys标准流”

修正“致命的Python错误: Py_Initialize:无法初始化sys标准流”
EN

Stack Overflow用户
提问于 2021-03-23 16:28:10
回答 2查看 3.1K关注 0票数 1

我的两个python环境具有不同版本的并行运行。当我在另一个python环境中从另一个python环境执行python脚本(test2.py)时,会得到以下错误:

代码语言:javascript
复制
Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\lib\io.py", line 52, in <module>
  File "C:\ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\lib\abc.py", line 147
    print(f"Class: {cls.__module__}.{cls.__qualname__}", file=file)
                                                      ^
SyntaxError: invalid syntax

所以我的设计是:

代码语言:javascript
复制
Python 3.7
 (test.py)
    │
    │                           Python 3.5.6
    ├───────────────────────────────┐
    ┆                               │
    ┆                         execute test2.py
    ┆                               │
    ┆                            Error

我怎么才能解决这个问题?

对于/问题/标记/dm-脚本-people:如何在数字显微图中使用不同版本的python执行模块?

详细信息

我有两个python文件。

文件1 (test.py):

代码语言:javascript
复制
# execute in Digital Micrograph
import os
import subprocess

command = ['C:\\ProgramData\\Miniconda3\\envs\\legacy\\python.exe', 
           os.path.join(os.getcwd(), 'test2.py')]
print(*command)

result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print("Subprocess result: '{}', '{}'".format(result.stdout.decode("utf-8"), result.stderr.decode("utf-8")))

和文件2 (test2.py)

代码语言:javascript
复制
# only executable in python 3.5.6
print("Hi")

在同一个目录下。test.py正在使用不同的python版本(python3.5.6,legacy环境)执行test2.py

我的python脚本(test.py)正在第三方程序(数字显微摄影)的python解释器中运行。这个程序安装了一个名为GMS_VENV_PYTHON (pythonVersion3.7.x)的迷你python环境,可以在上面的回溯中看到。在python3.5.6版本中,legacy miniconda环境仅用于运行test2.py (来自test.py)。

当我从命令行(也是在conda GMS_VENV_PYTHON环境中)运行GMS_VENV_PYTHON时,我将从test.py中的test2.py获得预期的输出。当我在数字显微照片中运行完全相同的文件时,我会得到响应

代码语言:javascript
复制
Subprocess result: '', 'Fatal Python error: Py_Initialize: can't initialize sys standard streams
Traceback (most recent call last):
  File "C:\ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\lib\io.py", line 52, in <module>
  File "C:\ProgramData\Miniconda3\envs\GMS_VENV_PYTHON\lib\abc.py", line 147
    print(f"Class: {cls.__module__}.{cls.__qualname__}", file=file)
                                                      ^
SyntaxError: invalid syntax
'

这告诉我以下几点(我猜):

  • 调用test2.py是因为这是子进程调用的错误输出。因此,subprocess.run()函数似乎运行良好。
  • 路径在GMS_VENV_PYTHON环境中,在这种情况下是错误的。因为这是test2.py,所以它们应该在legacy路径中
  • 有一个SyntaxError,因为使用了一个F-字符串(文字字符串插值),它是在python3.6中引入的。所以正在执行的python版本在3.6之前。因此使用legacy python环境。
  • test2.py要么使用io,要么使用abc (我不知道在这里得出什么结论;这些模块在执行python时是否默认加载?)

因此,我猜这意味着,标准模块从错误的目的地加载(我不知道为什么,可能是因为它们总是被加载)。

我怎么才能解决这个问题?(有关更多细节,请参阅我尝试过的>路径)

到目前为止我尝试过的

编码

我偶然看到一篇文章"初始化:无法初始化sys标准流LookupError:未知编码: 65001“告诉我,编码可能有问题。我知道数字显微摄影在内部使用ISO 8859-1.我尝试使用python -X utf8python -X utf8 (test2.py不关心UTF-8,它只是ASCII ),如下所示。但他们俩都不起作用

代码语言:javascript
复制
command = ['C:\\ProgramData\\Miniconda3\\envs\\legacy\\python.exe', 
           "-X", "utf8=0", 
           os.path.join(os.getcwd(), 'test2.py')]

路径

据我所知,这就是问题所在。文章"https://stackoverflow.com/a/31877629/5934316“的答案是"初始化:无法初始化sys标准流”,建议修改PYTHONPATH

因此,我想提出我的问题:

  1. 这是该走的路吗?
  2. 如何只为子进程设置PYTHONPATH (同时在主线程中与其他库一起执行python )?
  3. 是否有更好的方法同时拥有两个不同的python版本?

谢谢你的帮助。

背景

我目前正在编写一个处理电子显微镜的程序。我需要“环境”(图形界面,帮助工具,也是硬件访问)从数字显微照片。所以使用它是没有办法的。DigitalMicrograph只支持python3.7。

另一方面,我需要一个只能用于python 3.5.6的外部模块。此外,由于该模块控制其他硬件,因此无法使用该模块。

两者都依赖于python C模块。因为它们已经编译好了,所以不可能检查它们是否与其他版本一起工作。此外,他们正在控制高度敏感的地方,一个人不想改变代码。所以简单地说:我需要两个并行的python版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-23 16:41:15

我其实很亲近。问题是,python从错误的位置导入无效的模块。在我的示例中,由于路径错误,从另一个python安装中导入了模块。根据“PYTHONPATH”修改https://stackoverflow.com/a/4453495/5934316对于我的示例是有效的。

代码语言:javascript
复制
import os

my_env = os.environ.copy()
my_env["PYTHONHOME"] = "C:\\ProgramData\\Miniconda3\\envs\\legacy"
my_env["PYTHONPATH"] = "C:\\ProgramData\\Miniconda3\\envs\\legacy;"
my_env["PATH"] = my_env["PATH"].replace("C:\\ProgramData\\Miniconda3\\envs\\GMS_VENV_PYTHON", 
                                        "C:\\ProgramData\\Miniconda3\\envs\\legacy")

command = ["C:\\ProgramData\\Miniconda3\\envs\\legacy\\python.exe", 
           os.path.join(path, "test2.py")]

result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=my_env)

对于数字显微图用户: python环境保存在全局标记中的“私有:Python:Python路径”中。因此,替换:

代码语言:javascript
复制
import DigitalMicrograph as DM

# ...

success, gms_venv = DM.GetPersistentTagGroup().GetTagAsString("Private:Python:Python Path")

if not success:
    raise KeyError("Python path is not set.")

my_env["PATH"] = my_env["PATH"].replace(gms_venv, "C:\\ProgramData\\Miniconda3\\envs\\legacy")
票数 2
EN

Stack Overflow用户

发布于 2021-12-01 07:22:40

我以前为python (base) python环境将"PYTHONPATH“设置为”D:\ProgramData\Anaconda3 3“,但是当我更改为另一个env时,我的python仍然从”D:\ProgramData\Anaconda3 3“导入基本python包,这意味着它得到了错误的”系统环境变量“配置的基本包。

因此,我删除了"PYTHONPATH“从我的窗口”系统环境变量“,这将得到修正。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66767258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档