Pycharm 2017.1 EAP Python控制台和远程Docker解释器不能一起工作

问题描述:

我已经使用最小/ docker-django-mysite图像创建了一个纯Python项目来测试Python控制台功能。Pycharm 2017.1 EAP Python控制台和远程Docker解释器不能一起工作

我已经使用本地Python解释器测试了Python控制台,它可以正常工作。

但是,当我改变解释到远程多克尔解释,我得到的是下面的输出:

22c422193587:蟒蛇/opt/.pycharm_helpers/pydev/pydevconsole.py 0 0

PyDev控制台:开始。无法连接到控制台进程。

过程结束,退出代码137(通过信号中断9:SIGKILL)

现在,我已经能够泊坞窗Exec中的bash到容器在运行时(超时之前) ,并查看控制台进程已启动并正在随机端口上侦听。

此外,该临时容器的Docker日志显示两个数字,其中一个是它正在侦听的同一本地端口(所以我猜另一个与预期的外部主机端口连接或类似的东西)。

时间流逝,进程和容器被杀死。

顺便说一句,Docker容器对于运行/调试配置工作正常,所以它能够启动远程进程。

我已经能够使用pydevd从容器启动调试服务器回调到IDE,并正常调试代码,所以我不知道什么可能是错误的。

我认为临时容器没有公开其端口,所以我不知道IDE如何连接到该容器上的进程。

感谢您的帮助。

+1

我没有一个答案,但我看到完全相同的行为 - 运行/调试工作码头,勉强打破了python控制台。 – brentiumbrent

我有这个确切的问题,这个问题似乎缺少来自我的码头容器和PyCharm自动生成的我的码头容器的克隆的环境变量。

下面是一个特设来解决这个问题,在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不需要手动设置两种。