如何从子进程上下文获取my_application.exe的原始路径?
获取父进程my_application.exe的原始路径(子进程上下文)
当子进程通过-c这类参数启动时,sys.argv[0]无法提供父进程的原始路径,你可以通过以下几种方式解决:
方法1:用psutil库跨平台获取(推荐)
psutil是跨平台的进程管理库,能直接获取父进程的可执行文件路径,无需依赖系统特定API。
示例代码(Python):
import psutil def get_parent_exe_path(): current_process = psutil.Process() parent_process = current_process.parent() # 可选:校验父进程是否为目标程序 if parent_process and parent_process.name() == "my_application.exe": return parent_process.exe() return None parent_path = get_parent_exe_path() print(parent_path)
方法2:Windows平台原生API实现
如果是Windows环境,可通过pywin32调用系统API,先获取父进程ID,再查询其可执行路径。
示例代码(Python):
import win32api import win32process def get_parent_exe_path_win(): # 获取当前进程ID current_pid = win32process.GetCurrentProcessId() # 获取父进程ID parent_pid = win32process.GetParentProcessId(current_pid) # 打开父进程并读取路径 handle = win32api.OpenProcess(win32process.PROCESS_QUERY_INFORMATION | win32process.PROCESS_VM_READ, False, parent_pid) if handle: try: exe_path = win32process.GetModuleFileNameEx(handle, 0) return exe_path finally: win32api.CloseHandle(handle) return None parent_path = get_parent_exe_path_win() print(parent_path)
方法3:父进程主动传递路径(最可靠)
如果父子进程都在你的可控范围内,最稳妥的方式是启动子进程时,将父进程的原始路径通过环境变量或命令行参数传递,完全避免依赖进程查询API。
父进程侧代码:
import os import subprocess import sys # 获取自身的原始路径 parent_exe_path = os.path.abspath(sys.executable) # 若父进程是my_application.exe,替换为对应路径 # 方式1:通过环境变量传递 env = os.environ.copy() env["PARENT_EXE_PATH"] = parent_exe_path subprocess.Popen(["python", "-c", "import os; print(os.getenv('PARENT_EXE_PATH'))"], env=env) # 方式2:通过命令行参数传递 subprocess.Popen(["python", "-c", "import sys; print(sys.argv[1])", parent_exe_path])
子进程侧代码:
# 读取环境变量 import os print(os.getenv("PARENT_EXE_PATH")) # 或读取命令行参数 import sys print(sys.argv[1])
注意事项
- 方法1和2依赖进程权限,若子进程无足够权限读取父进程信息,可能执行失败。
- 方法3兼容性最好,优先用于可控的进程场景。
内容的提问来源于stack exchange,提问作者Letargon
相关产品推荐
相关产品推荐

