如何结合pathlib与subprocess模块用相对路径运行可执行文件
解决Windows下用pathlib+subprocess运行子文件夹exe的问题
嘿,我来帮你搞定这个问题!你遇到的进程没启动的情况,大概率是路径获取的问题,另外还有几个细节需要注意,我一步步给你拆解:
1. 别搞混「当前工作目录」和「脚本所在目录」
你用pathlib.Path.cwd()获取的是当前命令行的工作目录,而不是Python脚本所在的文件夹!比如如果你从桌面打开命令行,然后运行D盘某个文件夹里的脚本,那cwd()会是桌面路径,而不是脚本所在的D盘文件夹,这就导致生成的exe路径完全错了,自然找不到文件。
要获取脚本所在的目录,应该用:
script_dir = pathlib.Path(__file__).parent in_file_1 = script_dir / "folder2" / "folder3" / "whatever.exe"
这样不管你从哪里运行脚本,路径都是相对于脚本所在文件夹的,绝对不会错。
2. 先验证路径是否正确
在调用subprocess.Popen之前,先打印一下生成的路径,确认它指向的是真实存在的exe文件:
print(in_file_1) # 比如应该输出类似:D:\your_script_folder\folder2\folder3\whatever.exe
如果路径不对,那肯定启动不了,先把这个基础问题解决。
3. 处理路径中的空格(如果有的话)
如果你的文件夹或exe名称带空格,直接传字符串给shell=True的话,Windows的cmd会把路径拆成多个参数,导致找不到文件。这时候有两种解决方法:
- 方法一:给路径加引号
cmd = f'"{in_file_1}"' p = subprocess.Popen(cmd, shell=True)
- 方法二:不用
shell=True(更推荐,更安全)
默认shell=False时,直接传路径列表就行,不需要处理引号:
p = subprocess.Popen([str(in_file_1)])
4. 排查权限问题(如果exe需要管理员权限)
你提到预期进程在管理员任务中运行,如果这个exe必须要管理员权限才能启动,那直接用Popen是不会自动提升权限的。这时候可以用Windows的runas命令:
cmd = f'runas /user:Administrator "{in_file_1}"' p = subprocess.Popen(cmd, shell=True)
不过这个命令会弹出输入管理员密码的窗口,如果需要静默运行的话,可能需要借助其他工具,但先确保路径没问题再考虑权限的事。
5. 捕获错误信息帮你排查
如果还是启动不了,可以捕获stdout和stderr看看具体错误:
p = subprocess.Popen( str(in_file_1), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='gbk' # Windows默认编码是gbk,避免乱码 ) stdout, stderr = p.communicate() print("输出信息:", stdout) print("错误信息:", stderr)
比如如果输出“系统找不到指定的文件”,那就是路径的问题;如果是权限相关的错误,再针对性处理。
内容的提问来源于stack exchange,提问作者FJSJ
相关产品推荐
相关产品推荐

