【问题标题】:Python script to traverse windows directory and launch app via subprocessPython脚本遍历windows目录并通过子进程启动应用程序
【发布时间】:2013-01-26 04:00:33
【问题描述】:

我对 python 比较陌生,对 stackoverflow 显然很陌生。我的目标是在我的库中创建一个包含有关视频文件信息的文件:编解码器、大小、比特率和分辨率,我可以轻松解析这些信息。我计划使用这些信息来确定哪些视频文件的质量足够低,需要用更好看的编码替换。

我在 sourceforge 上找到了MediaInfo。我的脚本递归遍历给定目录并通过子进程调用 MediaInfo。由于 stackoverflow 上的 this 线程描述了如何解决 Windows 权限错误,我解决了一个较早的错误。我还实现了来自this 线程的代码来隐藏 Windows 命令提示符控制台,该控制台在每次调用子进程时都会被实例化。

目前,我的代码失败并出现以下错误: returned non-zero exit status 1

我的脚本的当前状态如下。提前致谢!

import os, subprocess

我推测问题可能在于我如何格式化传递给子进程的字符串

types = [".avi", ".mp4", ".mkv"]
app = "MediaInfo.exe"
app_path = os.path.join("C:\Program Files\MediaInfo\MediaInfo_CLI_0.7.61_Windows_x64", app)
movie_dir = "L:\Movies"
current_file = ""

下面的代码在没有控制台窗口的情况下启动子进程

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW

递归检查媒体目录并分析匹配文件

for root, dirs, files in os.walk(movie_dir):
    for filename in files:
        for extension in types:
            if (filename.endswith(extension)):
                current_file = '"' + os.path.join(root, filename) + '"'
                output = subprocess.check_output([app, current_file], 
                    executable=app_path, 
                    stderr=subprocess.STDOUT,
                    startupinfo=startupinfo)
                print app_path, current_file, output #debug
                with open("out.txt", "a") as f:
                    f.write(output)

【问题讨论】:

    标签: python subprocess stdout


    【解决方案1】:

    如果您使用的是 python 3(和 windows)及更高版本,请尝试使用原始字符串(或在 windows 上转义反斜杠),或者在形成路径时使用正斜杠!所以而不是

    app = "MediaInfo.exe"
    app_path = os.path.join("C:\Program Files\MediaInfo\MediaInfo_CLI_0.7.61_Windows_x64", app)
    movie_dir = "L:\Movies"
    

    尝试使用

    app = r'MediaInfo.exe'
    app_path = os.path.join(r'C:\Program Files\MediaInfo\MediaInfo_CLI_0.7.61_Windows_x64',  app)
    movie_dir = r'L:\Movies'
    

    在你的剧本中也同样领先。我在字符串“C:\Program Files..”中的空格以及不转义反斜杠时也遇到了很多麻烦。

    【讨论】:

    • 谢谢 - 原始字符串解决了我的问题。此外,我更改了循环 current_file = os.path.join(root, filename) 的第 5 行,以反映不需要进一步修改字符串。我还更改了最后一行 f.write(output.decode()) 以兼容 Python 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多