【问题标题】:Fix "Fatal Python error: Py_Initialize: can't initialize sys standard streams"修复“致命 Python 错误:Py_Initialize:无法初始化 sys 标准流”
【发布时间】:2021-06-20 08:23:44
【问题描述】:

我有两个 python 环境,不同版本并行运行。当我从另一个 python 环境中的一个 python 环境执行 python 脚本 (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

所以我的设置是这样的:

Python 3.7
 (test.py)
    │
    │                           Python 3.5.6
    ├───────────────────────────────┐
    ┆                               │
    ┆                         execute test2.py
    ┆                               │
    ┆                           ???? Error

我该如何解决这个问题?

对于-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、legacy 环境)执行 test2.py

我的 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)。

当我从命令行运行 test.py 时(也在 conda GMS_VENV_PYTHON 环境中),我从 test.py 中的 test2.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", 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-string (Literal String Interpolation),它是在python 3.6中引入的。所以执行的python版本是3.6之前的。所以使用legacypython环境。
  • test2.py 要么使用 io 要么 abc (我不知道在这里得出什么结论;这些模块是在执行 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", 
           os.path.join(os.getcwd(), 'test2.py')]

路径

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

所以要具体说明我的问题:

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

感谢您的帮助。


背景

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

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

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

【问题讨论】:

    标签: dm-script python subprocess dm-script


    【解决方案1】:

    其实我已经很接近了。问题是,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)
    

    对于 Digital Micrograph 用户:python 环境保存在“Private:Python:Python Path”的全局标签中。所以替换:

    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】:

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

      所以我从我的 Windows“系统环境变量”中删除了“PYTHONPATH”,这将得到修复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 2021-10-13
        • 2019-12-13
        • 2014-07-05
        相关资源
        最近更新 更多