python - 工作目录由 cwd 更改的 python subprocess.run 不起作用
问题描述
我正在尝试使用python 子进程来调用exe。应用程序通常从与 exe 相同的目录中获取参数文件。但是由于python文件和exe不在同一个目录下,所以在subprocess.run调用时exe找不到参数文件。因此,我在调用 subprocess.run 时指定了cwd ,如下所示:
subprocess.run([cwd_exe, "--cal-cn-bv", cwd_cif, "Cs1"], cwd=r'd:\Study\softBV_mix\GitHub\projects\Coord\bin', capture_output=True)
但是子进程仍然找不到 dat 文件
d:\Study\softBV_mix\GitHub\projects\Coord\bin
错误消息显示为
CompletedProcess(args=['d:\Study\softBV_mix\GitHub\projects\Coord\bin/softBV0405.exe', '--cal-cn-bv', 'd:\Study\softBV_mix\GitHub\projects\Coord\ test/CsCl.cif', 'Cs1'], returncode=0, stdout=b'警告:无法找到 d:\Study\softBV_mix\GitHub\projects\Coord\database_unitary.dat
database_unitary.dat 应该在.../coord/bin/ 中。如果我从 powershell 或命令提示符调用它,该应用程序运行良好。
解决方案
没有人回答我的问题,但我自己找到了解决方法,尽管我确定我是否正确识别了根本原因。
最后我导入了 os 并确保 cwd 是公认的绝对地址
导入操作系统
cwd = os.path.abspath("../bin")
这成功了。
所以表达式
r'd:\Study\softBV_mix\GitHub\projects\Coord\bin'
造成问题。希望一些PRO可以进一步澄清这一点。
推荐阅读
- data-cleaning - 如何获取数据子集并在 r 中进行汇总
- solr - 了解 solr(8.x) 默认 searchHandler
- firebase - Firebase 云功能在 Cordova 上不起作用
- ruby-on-rails - 如何跨 2 个 rails 实例处理 CSRF 令牌?
- go - 使用 gocolly 获取 div 元素失败
- java - 如何使用一个 jar 文件在同一个应用程序中运行服务器和客户端框架
- azure-data-factory - 如何强制将管道的状态设置为失败
- javascript - 如何修复过滤器搜索以在列表项内显示仪表图
- python - 如何过滤从条件索引开始的自定义间隔内的时间戳?
- sql - 如何从 Node.js 将记录插入 Postgres?node-pg 没有很好的文档记录