Pycharm 2017.1 EAP Python 控制台和远程 Docker 解释器不能一起工作
Posted
技术标签:
【中文标题】Pycharm 2017.1 EAP Python 控制台和远程 Docker 解释器不能一起工作【英文标题】:Pycharm 2017.1 EAP Python Console and Remote Docker Interpreter not working together 【发布时间】:2017-07-15 17:02:57 【问题描述】:我使用 minimum/docker-django-mysite 映像创建了一个纯 Python 项目来测试 Python 控制台功能。
我已经使用本地 Python 解释器测试了 Python 控制台,它可以正常工作。
但是当我将解释器更改为远程 Docker 解释器时,我得到的只是以下输出:
22c422193587:python /opt/.pycharm_helpers/pydev/pydevconsole.py 0 0
PyDev 控制台:正在启动。无法连接到控制台进程。
进程以退出代码 137 结束(被信号 9:SIGKILL 中断)
现在,我已经能够在容器运行时(在超时之前)将一个 bash shell docker exec 到容器中,并看到控制台进程已启动并正在侦听一个随机端口。
此外,该临时容器的 Docker 日志显示两个数字,其中一个是它正在侦听的同一个本地端口(所以我猜另一个与要连接的预期外部主机端口或类似的东西有关) .
时间过去了,进程和容器都被杀死了。
顺便说一句,Docker 容器在运行/调试配置中正常工作,因此它能够启动远程进程。
我已经能够使用pydevd启动从容器到IDE的调试服务器回调,并且可以正常调试代码,所以不知道是什么问题。
我认为临时容器没有暴露其端口,所以我不知道 IDE 期望如何连接到该容器上的进程。
感谢您的帮助。
【问题讨论】:
我没有答案,但我看到了完全相同的行为——运行/调试的 docker 工作,python 控制台几乎没有损坏。 【参考方案1】:我遇到了这个确切的问题,问题似乎是我的 docker 容器和 PyCharm 自动生成的 docker 容器的克隆都缺少环境变量。
这是一个在 Django 中解决这个问题的临时解决方案,首先打开:
首选项 > 构建执行部署 > 控制台 > Django 控制台
默认 Django 控制台启动脚本:
import sys
print('Python %s on %s' % (sys.version, sys.platform))
print(sys.executable)
import django;
print('Django %s' % django.get_version())
sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
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)
您需要在此处手动注入您的环境变量,否则解释器将无法读取 POSTGRES_ENV_,如下所示:
DATABASES =
'default':
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.environ["POSTGRES_ENV_DB_NAME"],
'USER': os.environ["POSTGRES_ENV_POSTGRES_USER"],
'PASSWORD': os.environ["POSTGRES_ENV_POSTGRES_PASSWORD"],
'HOST': os.environ["POSTGRES_PORT_5432_TCP_ADDR"],
'PORT': os.environ["POSTGRES_PORT_5432_TCP_PORT"],
所以只需运行:
docker exec -it CONTAINER_ID python -c 'import os; print(os.environ)'
然后将输出复制到剪贴板。最后,更新你的 Django 控制台启动脚本:
import os
os.environ = "POSTGRES_ENV_DB_NAME":foo, "POSTGRES_ENV_POSTGRES_USER":bar
import sys
print('Python %s on %s' % (sys.version, sys.platform))
print(sys.executable)
import django;
print('Django %s' % django.get_version())
sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
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)
确保 PROJECT_ROOT 和 WORKING_DIR_AND_PYTHON_PATHS 也不需要手动设置。
【讨论】:
以上是关于Pycharm 2017.1 EAP Python 控制台和远程 Docker 解释器不能一起工作的主要内容,如果未能解决你的问题,请参考以下文章