-1

Pythonのラッパーであるビルドシステム(waf)を使用しています。Python ビルド システムを呼び出すプログラム (perl スクリプト、exe など) がいくつかあります。cmd.exe からビルド スクリプトを実行するとき、それを呼び出したプログラムを見つける必要があります。私のOSはWindows 7です。Pythonモジュールで親PIDを取得しようとしましたが、PPIDとして「cmd」を返し、PIDとして「python.exe」を返すため、探しているものを見つけるのに役立ちませんでした。

OS レベルでいくつかのスタック トレースを確認する必要があると思いますが、その方法を見つけることができません。私が取るべきアプローチまたは可能なコードスニペットを手伝ってください。システムを呼び出したスクリプトまたはプログラムの名前を知る必要があるだけです。たとえば、caller.perl、callload.exe

ありがとうございました

4

3 に答える 3

2

なぜそれが必要になるのかはわかりませんが、これはそれ自体が楽しい問題なので、プロセスを介して親PIDループを作成し、名前を取得したら、ここにいくつかのヒントがあります。

WMIを使用する

import wmi
c = wmi.WMI ()

for process in c.Win32_Process ():
    if process.ProcessId == ppid:
      print process.ProcessId, process.Name

私はあなたがwin32APIを使って同じことをすることができると思います、例えば

processes = win32process.EnumProcesses()
for pid in processes:
    if pid == ppid:
       handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS,
False, pid)
       exe = win32process.GetModuleFileNameEx(handle, 0)  

これは、progAがprogBを直接実行する単純なケースでは機能しますが、間に子プロセスの長いチェーンがある場合は、適切な解決策ではない可能性があります。一般的なケースの最良の方法は、プログラムを呼び出して、引数として渡すことによって自分のIDを伝えることです。

progB --calledfrom progA
于 2012-10-19T16:18:57.197 に答える
0

プロセス エクスプローラーを使用して、呼び出されたプロセスのチェーンを確認し、親をトラバースするだけで名前を取得できました。回答してくれたすべての人に感謝します。

于 2012-10-23T13:17:14.663 に答える
0

Pythonスクリプトを変更して引数を追加し、どのファイルがそれを呼び出したかを示します。次に、それをロガー ファイルに記録します。それを呼び出すすべてのスクリプトは、引数ベクトルを介して Python スクリプトに対して自分自身を識別する必要があります。

例えば:

foo.pl は yourfile.py を次のように呼び出します。

yourfile.py /path/to/foo.pl

あなたのファイル.py:

def main(argv):
   logger.print(argv[1])
于 2012-10-19T15:59:28.273 に答える