【问题标题】:Python - Run a bash script for all files in a directoryPython - 为目录中的所有文件运行 bash 脚本
【发布时间】:2011-05-03 17:12:51
【问题描述】:

我正在创建一个 Python 脚本来充当我必须执行的一些与图像相关的常见任务的包装器,这是我遇到的部分问题:

有人为 ImageMagick 编写的 Bash 脚本位于此处:http://www.fmwconcepts.com/imagemagick/autocolor/index.php

本质上,它只能对单个文件进行操作(我不能将 *.jpg 传递给它,(这样做时它会失败)否则我不会遇到这个问题)所以我需要 Python 在每个文件上运行这一行文件:

~/autocolor.sh -m " + ColorMethod + " -c " + WorkingDirectory + InputFileName + " " + WorkingDirectory + OutputFileName

这是我当前的代码块:

elif RetouchOption == "04":
    ColorMethod = input("What method will you use (options are gamma, recolor, none)?: ")
    ClipMode = input("What clipping mode will you use (options are together or separate)?: ")
    for f in WorkingDirectory + "*.jpg":
        do
        os.system("sh ~/autocolor.sh -m " + ColorMethod + " -c " + WorkingDirectory + FileName + " " + WorkingDirectory + FileName)

WorkingDirectory 已经作为变量建立,并且 ColorMethod 和 ClipMode 在该块中建立。我需要做的是获取一个 FileName 变量(或其他使此代码工作的方法)。

感谢您的帮助!如果我没有提供足够的信息,请告诉我。我听说 os.system 不是执行此类操作的首选方式,但到目前为止,它在执行我在同一脚本中的其他命令时似乎运行良好,因此我将在其他时间解决更改。

【问题讨论】:

标签: python bash filenames


【解决方案1】:

这里有一些想法:

from glob import glob
import subprocess

elif RetouchOption == "04":
    ColorMethod = input("What method will you use (options are gamma, recolor, none)?: ")
    ClipMode = input("What clipping mode will you use (options are together or separate)?: ")
    script = ["sh", "~/autocolor.sh"]
    method = "-m %s" % ColorMethod
    clipmode = "-c %s" % ClipMode
    for filename in glob("*.jpg"):
        subprocess.call(script + [method, clipmode, filename, filename])

glob 很棒,正如您推测的那样,subprocess 优于 os.system。

请注意,没有 WorkingDirectory 的 glob 使用“脚本的当前工作目录”。要使其使用 WorkingDirectory,请尝试以下操作:

import os

for filename in glob(os.path.join(WorkingDirectory, '*.jpg')):
    ...

【讨论】:

  • 哇,这真的清理了我的 sn-p。我有很多关于 Python 的知识要学,我会试一试!
  • @Mylan 另一个清理项 - 请注意 StackOverflow 语法突出显示像 ColorMethod 这样的驼峰式项目 - 这是因为它认为它是一个类名。尝试使用不同的约定,如 color_method 或 colorMethod,这样每个人都知道它不是类型/类
  • 谢谢亨利,我也会继续努力的。我感谢所有的帮助。一个问题:glob(os.path.join(WorkingDirectory, '.jpg')) 中的文件名行:给我一个错误:'code' Traceback (last recent call last): File "/home/ mylan/Image-QA-0.3.py",第 111 行,在 中用于 glob 中的文件名(os.path.join(WorkingDirectory, '.jpg')):TypeError: 'module' object is not可调用...有什么想法吗?
  • 您可能使用了import glob 而不是from glob import glob - glob 既是模块名称又是函数名称。但不能 100% 确定。
  • 我认为你应该把“sh ~/autocolor.sh”分成两个字符串,所以你称之为:subprocess.call(["/bin/sh","/home/mylan/autocolor. sh", 方法, 剪辑模式, 文件名, 文件名])
【解决方案2】:

用bash不是更好吗?

for f in *.jpg; do ./autocolor.sh $f; done

【讨论】:

  • 是的,但是如果你只是喜欢 Python 怎么办 :) 而且看起来 elif "04" 的东西还有更多的逻辑。
  • 好吧,考虑一下“本质上,它只能对单个文件进行操作(我不能将 *.jpg 传递给它,(这样做时它会失败)否则我不会有这个问题)所以我需要 Python 在每个文件上运行这一行:” - 所以,我认为这不是关于 Python 的爱,而是不知道如何在 bash 中运行循环......
  • 我实际上指的是我对 Python 的热爱,这就是为什么我很乐意用有关 Python 的信息来回应。不过,我对额外的逻辑很认真- elif RetouchOption == "04": 行让我相信这个脚本可能在循环之外很重要。我认为这个问题会带来不同的答案,这很好,而且看起来你的问题排在首位,所以最好的 meme 确实赢了 :)
【解决方案3】:
for f in glob.glob('*.jpg'):
    do_something() 

【讨论】:

    【解决方案4】:

    这是对编码的建议。我编写了很多适用于 MySQL 的 Python 代码。我发现它有助于在变量中创建字符串并将其打印出来作为调试辅助工具,这样您就可以看到脚本在做什么。

    你会很好地回答你问题的早期答案。他们很有帮助。

    【讨论】:

      【解决方案5】:

      Python glob 模块可以轻松创建匹配模式的列表。

      例子:

          import glob
          glob.glob("*txt")
      

      以上代码将返回当前目录中所有“txt”文件的列表。

      http://docs.python.org/library/glob.html

      【讨论】:

        【解决方案6】:

        你有没有考虑过使用os.listdir来获取目录下的所有文件?

        一旦您列出了目录中的所有文件,您就可以提取所有 JPG,并使用以下代码删除文件名末尾的“.jpg”:

        >>> f = 'firstPic.jpg'
        >>> f. replace(".jpg", '')
        'firstPic'
        

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-29
          • 1970-01-01
          相关资源
          最近更新 更多