2017-02-24 50 views
3

我已經使用最小/ 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

回答

0

我有這個確切的問題,這個問題似乎缺少來自我的碼頭容器和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不需要手動設置兩種。

相關問題