微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

修复“致命的 Python 错误:Py_Initialize:无法初始化 sys 标准流” 编码路径

如何解决修复“致命的 Python 错误:Py_Initialize:无法初始化 sys 标准流” 编码路径

当我从正在运行的 python 脚本 (test2.py) 执行 python 脚本 (test.py) 时,我在 test2.py 中收到以下错误

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

我该如何解决这个问题?

对于 -people:如何在 Digital Micrograph 中执行具有不同 Python 版本的模块?


详情

我有两个 python 文件

文件 1 (test.py):

# 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)

# only executable in python 3.5.6
print("Hi")

在同一目录中。 test.py 正在使用不同的 Python 版本(python 3.5.6,test2.py 环境)执行 legacy

我的 Python 脚本 (test.py) 在第三方程序 (Digital Micrograph) 的 Python 解释器中运行。该程序安装了一个名为 GMS_VENV_PYTHON(python 版本 3.7.x)的 miniconda python 环境,可以在上面的回溯中看到。 legacy miniconda 环境仅用于在 Python 3.5.6 版中运行 test2.py(来自 test.py)。

当我从命令行(也在 conda test.py 环境中)运行 GMS_VENV_PYTHON 时,我从 test2.py 中的 test.py 获得预期输出。当我在 Digital Micrograph 中运行完全相同的文件时,我得到了响应

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",file=file)
                                                      ^
SyntaxError: invalid Syntax
'

这告诉我以下内容(我猜):

  • 调用 test2.py 是因为这是子进程调用错误输出。所以 subprocess.run() 函数似乎工作正常
  • 路径位于 GMS_VENV_PYTHON 环境中,在这种情况下是错误。由于这是 test2.py,它们应该在 legacy 路径中
  • 一个 SyntaxError 是因为使用了 f-string (Literal String Interpolation),它是在 python 3.6 中引入的。所以执行的python版本是3.6之前的。所以使用了 legacy python 环境。
  • test2.py 使用 use ioabc(我不知道在这里得出什么结论;这些模块在执行 python 时是否认加载?)

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

我该如何解决这个问题? (有关详细信息,请参阅我尝试过的内容 > PATH


到目前为止我尝试了什么

编码

我看到这篇文章Fatal Python error: Py_Initialize: can't initialize sys standard streams LookupError: unknown encoding: 65001”告诉我,编码可能有问题。我知道 Digital Micrograph 在内部使用 ISO 8859-1。我尝试使用 python -X utf8python -X utf8test2.py 不关心 UTF-8,它只是 ASCII),如下所示。但他们都没有工作

command = ['C:\\ProgramData\\Miniconda3\\envs\\legacy\\python.exe',"-X","utf8=0",'test2.py')]

路径

据我所知,我认为这就是问题所在。帖子“https://stackoverflow.com/a/31877629/5934316”的答案“PyCharm: Py_Initialize: can't initialize sys standard streams”建议更改PYTHONPATH

所以要说明我的问题:

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

感谢您的帮助。


背景

我目前正在编写一个处理电子显微镜的程序。我需要 Digital Micrograph 的“环境”(图形界面、帮助工具和硬件访问)。所以没有办法使用它。而且 DigitalMicrograph 只支持 python 3.7。

另一方面,我需要一个仅适用于 python 3.5.6 的外部模块。也没有办法使用这个模块,因为它控制其他硬件。

两者都依赖于 python C 模块。由于它们已经编译,因此无法检查它们是否适用于其他版本。此外,他们还控制着不想更改代码的高度敏感的光圈。简而言之:我需要两个并行的python版本。

解决方法

我实际上非常接近。问题是,由于路径错误,python 从另一个 python 安装导入模块。根据“https://stackoverflow.com/a/4453495/5934316”修改 PYTHONPATH 适用于我的示例。

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 环境保存在“Private:Python:Python 路径”中的全局​​标签中。所以替换:

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")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。