0

私はPythonが比較的新しく、明らかにスタックオーバーフローが初めてです。私の目標は、簡単に解析できるコーデック、サイズ、ビットレート、解像度など、ライブラリ内のビデオ ファイルに関する情報を含むファイルを作成することです。この情報を使用して、見栄えの良いエンコードに置き換えるのに十分な品質のビデオ ファイルを判断する予定です。

sourceforge でMediaInfoを見つけました。私のスクリプトは、特定のディレクトリを再帰的に走査し、サブプロセスを介して MediaInfo を呼び出します。Windows のアクセス許可エラーを回避する方法を説明している、stackoverflowのこのスレッドのおかげで、以前のバグを解決しました。また、このスレッドのコードを実装して、サブプロセスへの呼び出しごとにインスタンス化された 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)

4

1 に答える 1

0

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 ..'のスペースや、円記号をエスケープしないことで、多くの問題に直面しました。

于 2013-01-26T05:51:45.713 に答える