代码之家  ›  专栏  ›  技术社区  ›  miile7

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

  •  0
  • miile7  · 技术社区  · 4 年前

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

    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
    

    我该怎么解决这个问题?

    For -人民 :如何在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( 试验2.py )

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

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

    我的python脚本( test.py )在第三方程序的python解释器中运行( Digital Micrograph ). 该程序安装了一个名为minionda-python的环境 GMS_VENV_PYTHON (python版本3.7.x),可以在上面的回溯中看到。这个 遗产 minionda环境仅用于运行 试验2.py (从 test.py )在python 3.5.6版本中。

    当我奔跑时 test.py 从命令行(也在conda中 GMS_VENV_PYTHON 环境),我从中获得预期的输出 试验2.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", 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
    '
    

    这告诉我以下(我想):

    • 这个 试验2.py 被调用,因为这是子流程调用的错误输出。所以 subprocess.run() 功能似乎运行良好
    • 路径在 GMS_VENV_PYTHON 环境是 在这种情况下错了 。因为这是 试验2.py ,他们应该在 遗产 路径
    • 有一个 SyntaxError 因为a f-string (Literal String Interpolation) 它是python 3.6中引入的。因此,正在执行的python版本是3.6之前的版本。所以 遗产 使用python环境。
    • 试验2.py 使用任一用途 io 也没有 abc (我不知道在这里得出什么结论;在执行python时,这些模块是默认加载的吗?)

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

    我该怎么解决这个问题?(参见 我所尝试的>路径 了解更多详情)


    到目前为止我所尝试的

    编码

    我偶然发现了这篇文章” Fatal Python error: Py_Initialize: can't initialize sys standard streams LookupError: unknown encoding: 65001 “告诉我,编码可能有问题。我知道Digital Micrograph内部使用ISO 8859-1。我试着用 python -X utf8 python-X utf8 ( 试验2.py 不关心UTF-8,它只是ASCII),如下所示。但他们俩都不起作用

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

    路径

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

    为了明确我的问题:

    1. 这是该走的路吗?
    2. 我该如何设置 python路径 仅用于子进程(在主线程中使用其他库执行python时)?
    3. 是否有更好的方法同时拥有两个不同的python版本?

    谢谢你的帮助。


    背景

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

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

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

    1 回复  |  直到 3 年前
        1
  •  2
  •   miile7    3 年前

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

    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 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
  •  0
  •   tridu33    3 年前

    我之前为我的python(基础)环境设置了“PYTHONPATH”为“D:\ProgramData\Anconda3”,但我发现当我切换到另一个环境时,我的python仍然从“D:\PprogramData\Ancoonda3”导入基本python包,这意味着它使用错误的“系统环境变量”配置获得了错误的基本包。

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

    推荐文章