【问题标题】:Why is subprocess looping over the same set of files over and over为什么子进程一遍又一遍地循环同一组文件
【发布时间】:2017-05-20 13:08:00
【问题描述】:

所以我想使用 Python 调用一个 shell 脚本

from subprocess import call 

在位于不同目录的一组具有相同扩展名的文件上。这是我目前所拥有的:

        for path, subdirs, files in os.walk(dir_path):
            for name in files:
                if name.endswith(".avg"):
                    os.chdir(os.path.join(path))
                    call("shell_script *avg", shell=True)
                    print("creating new file for... " + name)

但它只是一遍又一遍地循环遍历同一组文件,最终在大约 5 次迭代之后,它会移动到下一组文件并执行相同的操作。我只是发现了这一点,因为我正在查看内核并看到它一遍又一遍地在相同的文件上执行相同的 shell 脚本。我在哪里错了?

【问题讨论】:

    标签: shell python-3.x subprocess


    【解决方案1】:

    call("shell_script *avg", shell=True) 在每个以avg 结尾的文件上调用shell_script。循环对每个以avg 结尾的文件执行一次。

    【讨论】:

      【解决方案2】:

      您不断用os.chdir(os.path.join(path)) 更改当前工作目录。如果您在dir_path 中使用相对路径,那么您将不断更改步行的基础。相反,跳过更改主程序中的目录并改为在子进程调用中设置它。此外,您需要传递实际文件名而不是 glob。

      for path, subdirs, files in os.walk(dir_path):
          for name in files:
              if name.endswith(".avg"):
                  call("shell_script {}".format(name), shell=True, cwd=path)
                  print("creating new file for... " + name)
      

      【讨论】:

      • ohhh 我认为它会更改目录以确保在找到它的同一目录中创建新文件。如果我想添加论点,我只需将每个参数放在引号中及其值像这样? call("shell_script.sh", "arg1", "value_for_arg1", shell=True, cwd=path) 或确实调用 shell=True 部分意味着 shell 正在分解场景背后的参数,脚本和参数应该是像这样的一个长字符串: call("shell_script.sh arg1 value_for_arg1", shell=True, cwd=path)
      猜你喜欢
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多