subprocess.Popenを介して作成されたPopenクラスのインスタンスがあります。そのプロセスの名前を取得したいのですが、それを取得できるメソッドまたはインスタンス変数が見つかりません。たとえば、私が持っていた場合:
p = subprocess.Popen('ls')
プロセスの名前を教えてくれる方法を見つけたいと思います。これは次のように機能します。
>>> p.name()
ls
subprocess.Popenを介して作成されたPopenクラスのインスタンスがあります。そのプロセスの名前を取得したいのですが、それを取得できるメソッドまたはインスタンス変数が見つかりません。たとえば、私が持っていた場合:
p = subprocess.Popen('ls')
プロセスの名前を教えてくれる方法を見つけたいと思います。これは次のように機能します。
>>> p.name()
ls
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'
Lattyware が述べたように、自分で Popen 呼び出しを行っている場合は、それを保存して後で取得することができます。インスタンスの内部dictに格納するだけでよいため、実際にはコンテナ クラスを使用してこれを行う必要はありません。
>>> import subprocess
>>>
>>> to_exec = 'ls'
>>> p = subprocess.Popen(to_exec)
>>> p.name = to_exec
そして後で:
>>> p.name
'ls'
>>>