我使用minimum / docker-django-mysite图像创建了一个Pure Python项目来测试Python控制台功能。
我使用本地Python解释器测试了Python控制台,它运行正常。
但是当我将Interpreter更改为Remote Docker Interpreter时,我得到的是以下输出:
22c422193587:python /opt/.pycharm_helpers/pydev/pydevconsole.py 0 0
PyDev控制台:开始。无法连接到控制台进程。
使用退出代码137完成处理(由信号9中断:SIGKILL)
现在,我已经能够在运行时(在它超时之前)将bash shell执行到容器中,并且看到控制台进程已经启动并正在随机端口进行侦听。
此外,该临时容器的Docker日志显示两个数字,其中一个是正在侦听的同一本地端口(所以我猜另一个与要连接的预期外部主机端口相关或类似的东西)
时间过去了,进程和容器被杀死了。
BTW,Docker Container可以正常运行Run / Debug配置,因此它可以启动远程进程。我已经能够使用pydevd启动从容器到IDE的调试服务器回调,并正常调试代码,所以我不知道可能出现什么问题。
我认为临时容器没有暴露其端口,所以我不知道IDE如何连接到该容器上的进程。
感谢您的帮助。
答案 0 :(得分:2)
我有这个确切的问题,问题似乎是我的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 也不需要手动设置。