簡體   English   中英

python popen特殊字符不解析文件

[英]python popen special characters not parsing file

我在使用非ASCII字符時遇到問題。

我正在使用python 2.7.3

python -V
Python 2.7.3

我安裝了http://pymediainfo.readthedocs.org/en/latest/

通過

easy_install pymediainfo

如下導入

from pymediainfo import MediaInfo

media_info = MediaInfo.parse(os.path.join(path, to, file))

結合使用ascii字符就可以了

為了調試,我從以下命令打印了“命令”:

/usr/local/lib/python2.7/dist-packages/pymediainfo-1.3.5-py2.7.egg/pymediainfo/__init__.py

在/usr/local/lib/python2.7/dist-packages/pymediainfo-1.3.5-py2.7.egg/pymediainfo/ init .py中“運行” mediainfo命令的類

ENV_DICT = {
    "PATH": "/usr/local/bin/:/usr/bin/",
    "LD_LIBRARY_PATH": "/usr/local/lib/:/usr/lib/"}

@staticmethod
def parse(filename, environment=ENV_DICT):
    command = ["mediainfo", "-f", "--Output=XML", filename]        
    print command
    print repr(command)
    fileno_out, fname_out = mkstemp(suffix=".xml", prefix="media-")
    fileno_err, fname_err = mkstemp(suffix=".err", prefix="media-")
    fp_out = os.fdopen(fileno_out, 'r+b')
    fp_err = os.fdopen(fileno_err, 'r+b')
    p = Popen(command, stdout=fp_out, stderr=fp_err, env=environment)
    p.wait()
    fp_out.seek(0)
    xml_dom = MediaInfo.parse_xml_data_into_dom(fp_out.read())
    fp_out.close()
    fp_err.close()
    return MediaInfo(xml_dom)

print和print repr()都顯示:

['mediainfo', '-f', '--Output=XML', "/mnt/path/Long 73\xc2\xb0 58' W.avi"]

文件名是:

Long 73° 58' W.avi

查看UTF-8表\\ xc2 \\ xb0對應於°

我知道這可能只是控制台未按需解釋編碼,而mediainfo的輸出僅為

<?xml version="1.0" encoding="UTF-8"?>
<Mediainfo version="0.7.58">
</Mediainfo>

表示“找不到文件”

os.path.isfile(os.path.join(path, to, file))

對這些文件返回true

並在bash中使用

mediainfo -f --Output=XML "/path/to/file"

作品

我已經掃了一眼,四處搜尋,看不到答案。

有任何想法嗎?

謝謝

更新

我用了這個新的測試腳本

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import os
import subprocess as sub
root = "/mnt/path"
    for rootfldr in sorted(os.listdir(root)):
        if os.path.isfile(os.path.join(root, rootfldr)):
            command = ['mediainfo', '-f', '--Output=XML', rootfldr]
            aa = sub.Popen(command, stdout=sub.PIPE, stderr=sub.PIPE, stdin=sub.PIPE)
            result = aa.communicate()[0]
            print rootfldr
            print result

結果很好(當時有些非ASCII字符)。

然后,我決定進行更改(從pymedinfo解析函數):

p = Popen(command, stdout=fp_out, stderr=fp_err, env=environment)

p = Popen(command, stdout=fp_out, stderr=fp_err)

問題解決了

我猜是有些東西缺失或錯誤

ENV_DICT = {
    "PATH": "/usr/local/bin/:/usr/bin/",
    "LD_LIBRARY_PATH": "/usr/local/lib/:/usr/lib/"}

該命令看起來正常。 文件名以字節串形式傳遞,其中包含使用utf-8編碼的文本。 如果您的文件系統使用utf-8,則它是正確的文件名:

>>> print "/mnt/path/Long 73\xc2\xb0 58' W.avi".decode('utf-8')
/mnt/path/Long 73° 58' W.avi

可能是pymediainfo的錯誤。 嘗試顯式傳遞environment參數作為一種變通方法,例如, environment=os.environ

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM