我的两个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我怎么才能解决这个问题?
对于/问题/标记/dm-脚本-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版本(python3.5.6,legacy环境)执行test2.py。
我的python脚本(test.py)正在第三方程序(数字显微摄影)的python解释器中运行。这个程序安装了一个名为GMS_VENV_PYTHON (pythonVersion3.7.x)的迷你python环境,可以在上面的回溯中看到。在python3.5.6版本中,legacy miniconda环境仅用于运行test2.py (来自test.py)。
当我从命令行(也是在conda GMS_VENV_PYTHON环境中)运行GMS_VENV_PYTHON时,我将从test.py中的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-字符串(文字字符串插值),它是在python3.6中引入的。所以正在执行的python版本在3.6之前。因此使用legacy python环境。test2.py要么使用io,要么使用abc (我不知道在这里得出什么结论;这些模块在执行python时是否默认加载?)因此,我猜这意味着,标准模块从错误的目的地加载(我不知道为什么,可能是因为它们总是被加载)。
我怎么才能解决这个问题?(有关更多细节,请参阅我尝试过的>路径)
到目前为止我尝试过的
编码
我偶然看到一篇文章"初始化:无法初始化sys标准流LookupError:未知编码: 65001“告诉我,编码可能有问题。我知道数字显微摄影在内部使用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')]路径
据我所知,这就是问题所在。文章"https://stackoverflow.com/a/31877629/5934316“的答案是"初始化:无法初始化sys标准流”,建议修改PYTHONPATH。
因此,我想提出我的问题:
PYTHONPATH (同时在主线程中与其他库一起执行python )?谢谢你的帮助。
背景
我目前正在编写一个处理电子显微镜的程序。我需要“环境”(图形界面,帮助工具,也是硬件访问)从数字显微照片。所以使用它是没有办法的。DigitalMicrograph只支持python3.7。
另一方面,我需要一个只能用于python 3.5.6的外部模块。此外,由于该模块控制其他硬件,因此无法使用该模块。
两者都依赖于python C模块。因为它们已经编译好了,所以不可能检查它们是否与其他版本一起工作。此外,他们正在控制高度敏感的地方,一个人不想改变代码。所以简单地说:我需要两个并行的python版本。
发布于 2021-03-23 16:41:15
我其实很亲近。问题是,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环境保存在全局标记中的“私有: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")发布于 2021-12-01 07:22:40
我以前为python (base) python环境将"PYTHONPATH“设置为”D:\ProgramData\Anaconda3 3“,但是当我更改为另一个env时,我的python仍然从”D:\ProgramData\Anaconda3 3“导入基本python包,这意味着它得到了错误的”系统环境变量“配置的基本包。
因此,我删除了"PYTHONPATH“从我的窗口”系统环境变量“,这将得到修正。
https://stackoverflow.com/questions/66767258
复制相似问题