Отладка подпроцессов Popen с помощью PyCharm

Я пытаюсь отлаживать приложение Python, которое использует объекты psutil.Popen. Когда я запускаю подпроцесс, PyCharm заменяет мою командную строку следующим образом:

python -m pydevd.py --multiproc --client 127.0.0.1 --port 52581 --file <myapplication>

который заканчивается ошибкой:

python.exe: Import by filename is not supported.

Когда я запускаю ту же команду без опции -m, все выглядит нормально. Есть ли способ изменить команду запуска отладчика PyCharm?

Я обновился до PyCharm Community Edition 4.0.3, и новая команда отладчика выглядит так:

python.exe "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.3\helpers\pydev\pydevd.py" 
--multiproc --client 127.0.0.1 --port 62661 
--file __main__.py local -c local.yml -f input/11_12.xls

где -c и -f - мои аргументы командной строки модуля. Команда запуска отладчика изменилась, но это не решило проблему; Я все еще получаю ошибку Import by filename is not supported.

Пример кода доступен здесь, на сайте Bitbucket.org. Конфигурация запуска Pycharm должна выглядеть так:

Script:            __main__.py
Script parameters: server
Working directory: %path to the repository%

Ответ 1

Как отметил Петр, PyCharm "Привязать к подпроцессу автоматически при отладке". Если подпроцессом является процесс Python, отладчик PyCharm изменяет параметры запуска процесса (см. Функцию patch_args в источнике). Когда вы запускаете подпроцесс таким образом:

args = ['python',
        '-m', 'pycharm-multiprocess-debug',
        'worker']
worker = subprocess.Popen(args)

Фактическая команда запуска выглядит следующим образом:

python.exe -m "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 4.0.3\helpers\pydev\pydevd.py"
--multiproc --client 127.0.0.1 --port 62661
--file pycharm-multiprocess-debug

Итак, все пошло не так. Я могу найти несколько обходных решений:

  • Самый простой способ, если вам не нужно отлаживать подпроцесс, просто отключите "Приложить к подпроцессу автоматически при отладке" внутри настроек PyCharm

  • измените свои аргументы на:

    args = ['python', '__main__.py', 'worker']
    

    Недостатком является то, что вы можете запускать только файл Python, а не модуль Python.

  • Я рекомендую последнее решение для подпроцесса Python:

    from multiprocessing import Process
    
    def server():
        p = Process(target=worker)
        p.start()
        print 'worker pid: {}'.format(p.pid)
        p.join()