提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
问题现象(及废话)
在做一个ansible+django的开发项目,因为ansible只支持运行在linux系统中,故而入了ubuntu的坑。
安装了Linxu版本的Pycharm专业版(社区版python控制台没有django支持,所以应该不存在此问题),起初相安无事使用pycharm的控制台调试django项目乐此不疲,Pycharm提示更新,不免点击升级尝鲜。
升级之后进入python控制台报错,因为我在django的setting.py引入了项目里的一个json文件,提示该文件不存在,但是文件明明就躺在那里一动不动。报错如下:
/home/melody/PycharmProjects/venv/ops/bin/python /home/melody/pycharm/plugins/python/helpers/pydev/pydevconsole.py --mode=client --host=127.0.0.1 --port=44397
import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend(['/home/melody/PycharmProjects/ops', '/home/melody/pycharm/plugins/python/helpers/pycharm', '/home/melody/pycharm/plugins/python/helpers/pydev'])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run("/home/melody/PycharmProjects/ops")
PyDev console: starting.
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Django 3.2.11
Traceback (most recent call last):
File "/usr/lib/python3.10/code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 6, in <module>
File "/home/melody/PycharmProjects/venv/ops/lib/python3.10/site-packages/django/__init__.py", line 19, in setup
configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
File "/home/melody/PycharmProjects/venv/ops/lib/python3.10/site-packages/django/conf/__init__.py", line 82, in __getattr__
self._setup(name)
File "/home/melody/PycharmProjects/venv/ops/lib/python3.10/site-packages/django/conf/__init__.py", line 69, in _setup
self._wrapped = Settings(settings_module)
File "/home/melody/PycharmProjects/venv/ops/lib/python3.10/site-packages/django/conf/__init__.py", line 170, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/home/melody/PycharmProjects/ops/itam/settings.py", line 17, in <module>
conf = json.load(open("config/config.json", "r", encoding="utf-8"))
FileNotFoundError: [Errno 2] No such file or directory: 'config/config.json'
问题排查
首先对着Pycharm乱点一通,没有毛用,就不详细说了。
有用的排查是这样,首先既然提示找不到文件,将项目因为文件改为绝对路径尝试,open成功不截图了。
那么就说明python控制台当前路径不再是当前项目路径,为了验证我的想法,作以下测试。
>>>import os
>>>print(os.getcwd())
/home/melody
果不其然,新版本的python控制台并不是当前项目路径,而是跑到了home路径下。
既然如此,问题就好解决了。
解决办法
1、打开 文件 - 设置 。
2、设置 中 找到 构建,执行,部署 - 控制台 - Django控制台
3、默认启动脚本是这么写的
import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run(PROJECT_ROOT)
4、在最前面加入 import os; os.chdir([WORKING_DIR_AND_PYTHON_PATHS][0])
import os; os.chdir([WORKING_DIR_AND_PYTHON_PATHS][0])
import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run(PROJECT_ROOT)
5、应用配置后,关掉控制台, 重新打开python控制台,问题解决
/home/melody/PycharmProjects/venv/ops/bin/python /home/melody/pycharm/plugins/python/helpers/pydev/pydevconsole.py --mode=client --host=127.0.0.1 --port=38087
import os; os.chdir(['/home/melody/PycharmProjects/ops', '/home/melody/pycharm/plugins/python/helpers/pycharm', '/home/melody/pycharm/plugins/python/helpers/pydev'][0])
import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend(['/home/melody/PycharmProjects/ops', '/home/melody/pycharm/plugins/python/helpers/pycharm', '/home/melody/pycharm/plugins/python/helpers/pydev'])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run("/home/melody/PycharmProjects/ops")
PyDev console: starting.
Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Django 3.2.11
>>>
总结
问题的主要原因是pycharm的linux版本在某个版本升级之后修改了,控制台启动的当前路径为home,而非当前项目路径。
升级后的版本分享一下,可能不只是这个最新的版本有问题,前几个版本也许就出现这个机制了。
PyCharm 2022.2.3 (Professional Edition)
Build #PY-222.4345.23, built on October 10, 2022
Licensed to Melody Chaser
订阅有效期至 2023年2月8日。
Runtime version: 17.0.4.1+7-b469.62 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Linux 5.15.0-47-generic
GC: G1 Young Generation, G1 Old Generation
Memory: 1986M
Cores: 8
Non-Bundled Plugins:
com.intellij.zh (222.202)
Current Desktop: ubuntu:GNOME