【问题标题】:python popen special characters not parsing filepython popen特殊字符不解析文件
【发布时间】:2014-03-18 16:02:48
【问题描述】:

我遇到了非 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 中“运行” mediainfo 命令的类.py

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/"}

【问题讨论】:

  • 您能否提供一个complete minimal code example 来打印Lat 40\xc2\xb0 47' N?你了解print repr(o)print o 的区别吗?
  • 我已经添加了功能代码,希望现在更容易理解
  • 您不需要发布mediainfo 代码。请阅读我之前评论中的链接。贴出其他人可以运行的代码并确认错误。

标签: python popen mediainfo


【解决方案1】:

命令看起来没问题。文件名作为字节串传递,其中包含使用 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

【讨论】:

  • 谢谢,不幸的是,在我发现环境问题之前,我没有看到您的评论更新。 environment=os.environ 确实有效。
  • 查看github版本github.com/paltman/pymediainfo这正是开发人员所做的。 ENV=os.environ
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多