Python:获取Popen实例的命令名称

tro*_*ino 4 python popen python-2.7

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

p = subprocess.Popen('ls')
Run Code Online (Sandbox Code Playgroud)

我想找一个方法来给我这个过程的名称,这个方法就像:

>>> p.name()
ls
Run Code Online (Sandbox Code Playgroud)

Gar*_*tty 6

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

纵观源为3.2.3,您可以看到信息没有存储在对象(被丢弃).但是,在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'
Run Code Online (Sandbox Code Playgroud)


小智 6

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

>>> import subprocess
>>> 
>>> to_exec = 'ls'
>>> p = subprocess.Popen(to_exec)
>>> p.name = to_exec
Run Code Online (Sandbox Code Playgroud)

然后后来:

>>> p.name
'ls'
>>> 
Run Code Online (Sandbox Code Playgroud)