【问题标题】:Debugging Popen subprocesses with PyCharm使用 PyCharm 调试 Popen 子进程
【发布时间】:2014-10-20 12:01:23
【问题描述】:

我正在尝试调试一个使用 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 错误。

代码示例可用here at Bitbucket.org。 Pycharm 的运行配置应该是这样的:

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

【问题讨论】:

  • 这很难。我得再看看。
  • &lt;myapplication&gt; 长什么样子?它只是一个名称还是完整路径?如果它是完整路径,请尝试将其更改为仅名称并确保父文件夹位于 sys.path 中。与stackoverflow.com/questions/14465473比较
  • Community Edition 3.4 面临同样的问题(以及我 Python 开发的第二天)。任何人都可以评论它是否适用于以前的版本?
  • 我找到了解决方法。首先从 PyCharm 运行脚本,然后将调试器附加到进程(这应该显示所有子进程)。工具 --> 附加到进程。我在某处读到 PyCharm 不支持子进程调试,并计划在 V4 中进行调试。
  • @Prabhjot From jetbrains.com/pycharm/webhelp/python-debugger.html - 调试时自动附加到子进程:如果选中此复选框,PyCharm 将自动附加正在调试的进程的所有子进程。因此,如果父进程有子进程,它们的断点将始终有效。 该功能在 PyCharm 2.7 中已经可用(甚至可能在 2.7 之前可用)。

标签: python multiprocessing pycharm


【解决方案1】:

正如 Piotr 提到的,PyCharm '在调试时自动附加到子进程'。如果 subprocess 是 Python 进程,PyCharm 调试器会更改进程的启动参数(参见函数 patch_args source)。当您以这种方式启动子流程时:

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()
    

【讨论】:

  • 我应该在哪里写代码?? args = ['python', 'main.py', 'worker']
  • @MARCO,args 在 Ivan 的代码示例中:bitbucket.org/lgyanf/pycharm-multiprocess-debug/src/…
  • 我当前的命令(没有附加 Pycharm 调试器)如下所示:subprocess.Popen("cd /users/lewis/; ENV_VAR=99; python main.py")跨度>
  • @user3180 你没有提到shell=True,但显然你已经尝试运行一个shell命令序列。子进程调试不适用于shell=True。要运行的程序必须是'python'(我建议使用sys.executable 而不是'python' 以确保它与父级Python 相同)。在您的情况下,您还需要传递 cwdenv 参数。
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2013-12-07
相关资源
最近更新 更多