【问题标题】:Python: get command name of Popen instancePython:获取 Popen 实例的命令名称
【发布时间】:2012-06-14 21:18:21
【问题描述】:

我有一个通过 subprocess.Popen 创建的 Popen 类的实例。我想获得该进程的名称,但我找不到任何可以让我了解的方法或实例变量。例如,如果我有:

p = subprocess.Popen('ls')

我想找到一种方法来给我进程的名称,就像这样:

>>> p.name()
ls

【问题讨论】:

  • 打电话时为什么不存储数据?
  • 您可能会将Popen.pid 匹配到相应的进程名称。
  • @Michael - 仅当进程尚未终止时。
  • @Lattyware 本来就是这么想的,但是我觉得肯定有办法通过对象获取进程名。拥有一个 Popen 对象列表而不是创建一个容器类来包含命令名称也会更简洁。
  • @Lattyware 有效点;我应该说应该 :)

标签: python python-2.7 popen


【解决方案1】:

答案是否定的,直到最新版本的 Python(不稳定)。

查看the source for 3.2.3,您可以看到信息没有存储在对象中(它被丢弃了)。但是,在the latest development version of Python 中,它已被添加为subprocess.Popen.args

因此,假设它进入了 3.3,那么您唯一一次将其视为一个功能。开发文档没有提到它,但这可能只是它们没有被更新。它没有以下划线 (_args) 为前缀的事实意味着它旨在成为公共属性。

如果您迫切希望将其作为对象的一部分,最简单的答案就是继承subprocess.Popen() 并自己添加数据。也就是说,在大多数情况下,我真的认为这不值得。

>>> class NamedPopen(Popen):
...     def __init__(self, cargs, *args):
...         Popen.__init__(self, cargs, *args)
...         self.args = cargs
... 
>>> x = NamedPopen("ls")
>>> x.args
'ls'

【讨论】:

    【解决方案2】:

    正如 Lattyware 所提到的,如果您自己进行 Popen 调用,则可以将其保存,以便以后检索。您实际上不需要使用容器类来执行此操作,因为您可以将其存储在实例的内部 dict 中:

    >>> import subprocess
    >>> 
    >>> to_exec = 'ls'
    >>> p = subprocess.Popen(to_exec)
    >>> p.name = to_exec
    

    然后:

    >>> p.name
    'ls'
    >>> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      相关资源
      最近更新 更多