使用PyCharm调试Popen子进程

17 投票
1 回答
12431 浏览
提问于 2025-04-28 13:08

我正在调试一个使用 psutil.Popen 对象的 Python 应用程序。当我启动一个子进程时,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 个回答

19

正如Piotr提到的,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

所以这样就出错了。我找到了一些解决办法:

  1. 最简单的方法是,如果你不需要调试子进程,就在PyCharm的设置里关闭“调试时自动附加到子进程”这个选项。

  2. 把你的参数改成:

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

    缺点是你只能运行一个Python文件,而不能运行Python模块。

  3. 我推荐最后一个解决方案来处理Python子进程:

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

撰写回答