我的机器上有多个 python 版本(3.8、3.9、3.10 和 3.11),用于不同的项目。除了 3.11 之外,所有版本都可以在 PyCharm 2023.1.1 上正常运行。 我有一个基于 Flask 的项目,它使用 3.11 并且运行良好。然而,当我尝试调试它时,服务器启动,然后抛出以下错误:
Connected to pydev debugger (build 231.8770.66)
*Serving Flask app 'app'
Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
Running on https://127.0.0.1:5001
Press CTRL+C to quit
Restarting with stat
C:\Users\SomeUser\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe: can't open file 'C:\\Program': [Errno 2] No such file or directory
Process finished with exit code 2
虚拟环境是由PyCharm解释器自动创建的,使用的是python3.11。似乎 python.exe 试图打开一个名为 Program 的不存在的文件夹,我认为它是 Program Files,但我不明白为什么。 我尝试更改/添加 PATH 和 PYTHONPATH。玩过各种配置设置。安装并重新安装了 python3.11 和 PyCharm,到目前为止似乎没有任何效果。 在我尝试旧版本的 PyCharm 之前,对可能导致问题的原因有什么建议吗?
我尝试更改python3.11的环境变量。我尝试安装并重新安装 python3.11 和 PyCharm。我尝试更改设置。我在 Pycharm 中启用了 Python 调试器的 g-event 兼容性。我没有尝试使用较旧的 PyCharm 版本。
更新环境后我遇到了类似的问题。我重新尝试使用旧的 python 3.10.5,但更新了 python 包并更新了 PyCharm。在这种情况下,flask 的调试模式就可以正常工作了。
但是,当使用python 3.11时,flask调试模式不再起作用。我收到错误了
FileNotFoundError: [WinError 2] The system cannot find the file specified
原因似乎是 python 3.11 关于 sys.executable 的错误:
https://github.com/python/cpython/issues/102496
=> 尝试暂时修复主程序开头的路径。
对我来说,以下代码行成功了:
sys.executable = sys.executable.replace('\\App', '\\..\\..\\App')
我尝试删除 PyCharm 路径字符串中的所有空格,这解决了问题。也就是说,如果我将其安装在自定义文件夹中,例如
C:/PyCharm
并将 PyCharm 自动生成的文件夹 PyCharm 2023 重命名为 PyCharm_2023 它也可以工作。
这里有一个解决方法,可以解决我在 Windows 上运行的 Pycharm 社区版的问题。
编辑 WerkZeug 库文件:....\Lib\site-packages\werkzeug_reloader.py,位于函数中第 272 行附近:
def restart_with_reloader(self)
,就在调用之前:
exit_code = subprocess.call(args, env=new_environ, close_fds=False)
插入这行代码,将每个包含空格和双引号的参数包围起来:
args = [ f'""{a}""' if ' ' in a else a for a in args ]
所以你得到:
def restart_with_reloader(self) -> int:
"""Spawn a new Python interpreter with the same arguments as the
current one, but running the reloader thread.
"""
while True:
_log("info", f" * Restarting with {self.name}")
args = _get_args_for_reloading()
new_environ = os.environ.copy()
new_environ["WERKZEUG_RUN_MAIN"] = "true"
## WORK-AROUND FIX ##
args = [ f'""{a}""' if ' ' in a else a for a in args ]
exit_code = subprocess.call(args, env=new_environ, close_fds=False)
if exit_code != 3:
return exit_code