Fix "Fatal Python error: Py_Initialize: can't initialize sys standard streams"
Fix "Fatal Python error: Py_Initialize: can't initialize sys standard streams"
我有 两个 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
我该如何解决这个问题?
对于dm-script-people:如何在数码显微照片中执行具有不同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
) 运行ning 在第三方程序 (Digital Micrograph) 的 python 解释器中。该程序安装了一个名为 GMS_VENV_PYTHON
(python 版本 3.7.x)的 miniconda python 环境,可以在上面的回溯中看到。 legacy
miniconda 环境仅用于 运行ning test2.py
(来自 test.py
)在 python 版本 3.5.6.
当我从命令行 运行 test.py
时(也在 conda GMS_VENV_PYTHON
环境中),我在 [=17= 中从 test2.py
得到了预期的输出].当我 运行 在数码显微照片中使用完全相同的文件时,我得到了响应
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之前的。所以使用legacy
python环境
test2.py
使用 use io
或 abc
(我不知道这里要得出什么结论;执行 python 时是否默认加载这些模块?)
所以我想这意味着标准模块是从错误的目的地加载的(我不知道为什么,可能是因为它们总是被加载)。
我该如何解决这个问题? (有关详细信息,请参阅 我尝试过的 > PATH)
到目前为止我尝试了什么
编码
我遇到这个 post “” 告诉我,编码可能有问题。我知道 Digital Micrograph 在内部使用 ISO 8859-1。我尝试使用 python -X utf8
和 python -X utf8
(test2.py
不关心 UTF-8,它只是 ASCII),如下所示。但是他们都没有工作
command = ['C:\ProgramData\Miniconda3\envs\legacy\python.exe',
"-X", "utf8=0",
os.path.join(os.getcwd(), 'test2.py')]
路径
据我所知,我认为这就是问题所在。答案“" of the post "PyCharm: Py_Initialize: can't initialize sys standard streams”建议更改PYTHONPATH
。
所以要说明我的问题:
- 这是要走的路吗?
- 如何只为子进程设置
PYTHONPATH
(同时在主线程中与其他库一起执行 python)?
- 有没有更好的方法同时拥有两个不同的 python 版本?
感谢您的帮助。
背景
我目前正在编写一个处理电子显微镜的程序。我需要来自 Digital Micrograph 的“环境”(图形界面、帮助工具以及硬件访问)。所以没有办法绕过它。而 DigitalMicrograph 只支持 python 3.7.
另一方面,我需要一个仅适用于 python 3.5.6 的外部模块。也没有办法使用这个模块,因为它控制其他硬件。
两者都依赖于 python C 模块。由于它们已经编译,因此无法检查它们是否适用于其他版本。他们还控制着人们不想更改代码的高度敏感的孔径。简而言之:我需要两个 python 并行版本。
我其实很接近。问题是,python 从错误的位置 导入了无效模块。在我的例子中,由于路径错误,模块是从另一个 python 安装导入的。根据“”修改 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 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")
我之前为我的 python(基础)python 环境将“PYTHONPATH”设置为“D:\ProgramData\Anaconda3”,但是当我换到另一个环境时我发现python 仍然从“D:\ProgramData\Anaconda3”导入基本的 python 包,这意味着它使用错误的“系统环境变量”配置获取错误的基本包。
所以我从 windows“系统环境变量”中删除了“PYTHONPATH”,这将得到修复。
我有 两个 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
我该如何解决这个问题?
对于dm-script-people:如何在数码显微照片中执行具有不同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
) 运行ning 在第三方程序 (Digital Micrograph) 的 python 解释器中。该程序安装了一个名为 GMS_VENV_PYTHON
(python 版本 3.7.x)的 miniconda python 环境,可以在上面的回溯中看到。 legacy
miniconda 环境仅用于 运行ning test2.py
(来自 test.py
)在 python 版本 3.5.6.
当我从命令行 运行 test.py
时(也在 conda GMS_VENV_PYTHON
环境中),我在 [=17= 中从 test2.py
得到了预期的输出].当我 运行 在数码显微照片中使用完全相同的文件时,我得到了响应
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之前的。所以使用legacy
python环境 test2.py
使用 useio
或abc
(我不知道这里要得出什么结论;执行 python 时是否默认加载这些模块?)
所以我想这意味着标准模块是从错误的目的地加载的(我不知道为什么,可能是因为它们总是被加载)。
我该如何解决这个问题? (有关详细信息,请参阅 我尝试过的 > PATH)
到目前为止我尝试了什么
编码
我遇到这个 post “python -X utf8
和 python -X utf8
(test2.py
不关心 UTF-8,它只是 ASCII),如下所示。但是他们都没有工作
command = ['C:\ProgramData\Miniconda3\envs\legacy\python.exe',
"-X", "utf8=0",
os.path.join(os.getcwd(), 'test2.py')]
路径
据我所知,我认为这就是问题所在。答案“" of the post "PyCharm: Py_Initialize: can't initialize sys standard streams”建议更改PYTHONPATH
。
所以要说明我的问题:
- 这是要走的路吗?
- 如何只为子进程设置
PYTHONPATH
(同时在主线程中与其他库一起执行 python)? - 有没有更好的方法同时拥有两个不同的 python 版本?
感谢您的帮助。
背景
我目前正在编写一个处理电子显微镜的程序。我需要来自 Digital Micrograph 的“环境”(图形界面、帮助工具以及硬件访问)。所以没有办法绕过它。而 DigitalMicrograph 只支持 python 3.7.
另一方面,我需要一个仅适用于 python 3.5.6 的外部模块。也没有办法使用这个模块,因为它控制其他硬件。
两者都依赖于 python C 模块。由于它们已经编译,因此无法检查它们是否适用于其他版本。他们还控制着人们不想更改代码的高度敏感的孔径。简而言之:我需要两个 python 并行版本。
我其实很接近。问题是,python 从错误的位置 导入了无效模块。在我的例子中,由于路径错误,模块是从另一个 python 安装导入的。根据“”修改 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 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")
我之前为我的 python(基础)python 环境将“PYTHONPATH”设置为“D:\ProgramData\Anaconda3”,但是当我换到另一个环境时我发现python 仍然从“D:\ProgramData\Anaconda3”导入基本的 python 包,这意味着它使用错误的“系统环境变量”配置获取错误的基本包。
所以我从 windows“系统环境变量”中删除了“PYTHONPATH”,这将得到修复。