使用os.system、subprocess.run运行cmd指令失效问题

使用os.system、subprocess.run运行cmd指令失效问题

背景介绍

最近需要使用命令行下载和处理GFS的天气数据集,即通过url下载后,使用wgrib2提取所需风层,并使用grib2json批量转为json格式。由于数据量过多,故使用python写批量下载和处理代码,在运行os.system(grib2json_cmd)代码时,无论怎样都没办法生成所需文档。原部分代码如下:

import subprocess
import os
# 构建命令
grib2json_cmd = 'grib2json -d -n -o D:/Desktop/earth-master/public/data/weather/2023/05/03/0000-wind-isobaric-20hPa-gfs-1.0.json D:/Desktop/earth-master/public/data/grib2_tmp/gfs_3_20230503_0000_000.20.grib2'
#os.system("grib2json -d -n -o D:/Desktop/earth-master/public/data/weather/2023/05/03/0000-wind-isobaric-20hPa-gfs-1.0.json D:/Desktop/earth-master/public/data/grib2_tmp/gfs_3_20230503_0000_000.20.grib2")

#result = subprocess.run(grib2json_cmd, capture_output=True, text=True, shell=True)
os.system(grib2json_cmd)

但无论用os.system还是用subprocess.run运行,都没有任何反应。。。

就这样。。。找了一上午办法,问Chatgpt4都没用,这是chatgpt4给出的答案:

当你在命令行(cmd)中可以正常运行某个命令,但是在Python中通过os.system调用同样的命令却运行失败,可能有以下几个原因:

  1. 环境变量问题:命令行和Python环境中的环境变量可能不同。特别是PATH环境变量,它影响系统如何查找可执行文件。确保在Python脚本中调用的命令在脚本运行的环境中可用。
  2. 当前工作目录问题:使用os.system运行命令时,当前的工作目录可能与你在cmd中手动运行命令时的工作目录不同。这可能会影响到依赖特定工作目录的命令。可以使用os.chdir()改变Python脚本中的工作目录。
  3. 权限问题:在某些情况下,Python脚本可能没有足够的权限去执行某些命令,尤其是当需要管理员权限时。尝试以管理员权限运行Python脚本。
  4. 命令路径问题:如果命令不是系统的内置命令,可能需要提供完整的命令路径。在cmd中可以运行可能是因为该路径被添加到了PATH环境变量中,但在Python脚本中可能需要指定完整路径。
  5. 引号和特殊字符:在os.system中调用命令时,对于包含空格或特殊字符的路径和参数,需要正确地使用引号。这些引号在cmd中和在Python字符串中可能需要不同的处理。
  6. 更好的替代方案os.system是一个很基础的方法,用于执行外部命令,它的功能相对有限。如果可能,考虑使用subprocess模块,它提供了更多的控制能力和灵活性。subprocess.runsubprocess.Popen可以替代os.system,并且可以更好地处理命令行参数,捕获输出等。
    如果遇到具体问题,建议查看命令的执行结果或错误信息,这些信息通常可以提供为什么命令在Python中不能正常运行的线索。使用subprocess模块还可以帮助你捕获和分析命令的标准输出和标准错误输出,以便于调试。

在做过所有尝试后均无效。。所以决定先回去睡觉。

解决办法

直到下午回来,试着更换了文件目录,发现运行后仍然无效,故准备放弃。但发现每次运行后,编译器都自动弹出之前自己编写的grib2json.py的代码(而cmd中使用的是github提供的grib2json软件包)。这才终于意识到了,我把这个grib2json.py放在了跟我运行的代码同一目录下,运行时直接调用它了。。。。。

所以在此告诫各位有幸跟我遇到同样问题的仁兄:

不要在工程目录下放与需要调用的外部包一样名称的文件!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值