

お世話になっております。

PythonでプロセスIDから実行ファイルのパスを取得したいと考えています。  
なお、プロセスIDは、何らかの方法で取得できているものとします。  
それで、ざっと調べた限りだと、psutilを使えば簡単に実装できそうな感じなんですが、そのためだけにpsutilを入れるのも微妙なので、他に方法がないかと思っています。  
Win32APIとかでできるようでしたら、その方法を教えていただけないでしょうか。  
環境は、Windows10、Python3.7.5です。

以上、よろしくお願いいたします。


CC BY-SA 4.0
2020-01-15T12:14:56.043
62265
2020-01-17T01:49:42.043
2020-01-15T12:28:14.207
3060
29034
question
python python3 windows
PythonでプロセスIDから実行ファイルのパスを取得したい


wmicを使ったコードを実際に動かしてみました。  
体感ですが、結構早いです。予想外でした。  
wmicコマンドを起動するため、多用するとシステムに負荷を与えることは否めませんが、単発で使う分には問題ないと思います。。

# コード

[code]

    import subprocess
    pid = 16252
    cmd = "wmic process where (ProcessId = " + str(pid ) + ") get ExecutablePath /format:CSV"
    result = subprocess.check_output(cmd, shell=True)
    print(result.decode(encoding='shiftjis'))
    
[/code]

# 出力結果

[code]

    Node,ExecutablePath
    
    
    XXXX,C:\Program Files (x86)\デジタル時計\デジタル時計.exe
    
[/code]

XXXXはコンピュータ名です。伏せています。

# Pythonのバージョン

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64
bit (AMD64)] on win32


CC BY-SA 4.0
2020-01-17T00:39:35.790
62308
2020-01-17T00:39:35.790
35558
62265
answer


お世話になります。  
結局今回の場合は、プロセスハンドルがわかっていたので、ctypesで取得することができました。  
コメントや回答でアドバイスをくださり、ありがとうございました。  
一応サンプルを掲載しておきます。

[code]

    from ctypes import *
    
    def getExeFileName(processHandle):
        exeFileName = create_unicode_buffer(wintypes.MAX_PATH)
        length = wintypes.DWORD(wintypes.MAX_PATH)
        if windll.Kernel32.QueryFullProcessImageNameW(processHandle, 0, exeFileName, byref(length)):
            return exeFileName.value
        else:
            return None
    
[/code]


CC BY-SA 4.0
2020-01-17T01:49:42.043
62310
2020-01-17T01:49:42.043
29034
62265
answer