我有
两个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
dm-script
-人民
:如何在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
.
为了明确我的问题:
-
这是该走的路吗?
-
我该如何设置
python路径
仅用于子进程(在主线程中使用其他库执行python时)?
-
是否有更好的方法同时拥有两个不同的python版本?
谢谢你的帮助。
背景
我目前正在编写一个处理电子显微镜的程序。我需要Digital Micrograph的“环境”(图形界面、帮助工具以及硬件访问)。所以没有办法使用它。DigitalMicrograph只支持python 3.7。
另一方面,我需要一个仅适用于python 3.5.6的外部模块。此外,由于该模块控制其他硬件,因此无法使用。
两者都依赖于python C模块。由于它们已经编译完成,因此无法检查它们是否适用于其他版本。此外,他们还控制着不想更改代码的高灵敏度光圈。简而言之:我需要两个并行的python版本。