Python模块xattr没有list属性。

4
我写了一个脚本,使用xattr模组为某些文件设置扩展属性。在Ubuntu的python3中成功测试过,但在我的树莓派上无法运行。
我不得不改变几十个小错误,主要是像xattr不认识它的方法之类的问题。
例如,xattr.set(...)必须改为xattr.setattr(...)。但我没能把它们列出来。所以我尝试了一些基础操作,结果出现错误:
import xattr
xattr.list('files.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'xattr' has no attribute 'list'

我认为Python可能正在使用错误的模块(针对Python 2.7而不是3?),于是我尝试卸载2.7模块,但得到了以下错误:

...$ pip uninstall xattr
Traceback (most recent call last):
File "/usr/local/bin/pip", line 7, in <module>
from pip._internal import main
ImportError: No module named _internal

我成功卸载了python3软件包。但是之后在python3中“import xattr”仍然有效吗?

导入后键入 dir(xattr) 会得到什么?以及 xattr.__file__ 呢?听起来你可能在当前路径下有一个名为 xattr.py 的文件,并且正在导入它。 - mfitzp
对于dir(xattr),我得到了一个列表(方法?):[... 'all', 'builtins', 'cached', 'doc', 'file', 'loader', 'name', 'package', 'path', 'spec', 'version', '_fgetxattr','_flistxattr','_fremovexattr','_fsetxattr','_getxattr','_lib','_listxattr','_removexattr','_setxattr','compat','getxattr','integer_types','lib','listxattr','removexattr','setxattr','xattr'],这似乎是该模块的旧版本。但是,如果我无法删除旧版本(请参见上面的错误),我如何强制Python使用新版本? - Henry
你会得到什么关于 xattr.__file__ 的信息?这将告诉你它从哪里进行了导入。 - mfitzp
'/home/pi/.local/lib/python3.5/site-packages/xattr/init.py' - Henry
1个回答

3

现在是凌晨3点,我在听着The Glitch Mob的音乐,因为好奇心驱使我走进了这个兔子洞…… 我想给你展示如何使用Python内置的xattr模块编写代码的例子。

创建一个名为xattr_example.py的文件,将以下代码复制到文件中,然后运行该文件。

文件:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
"""The Following Is An Example for xattr."""
# =============================================================================

import xattr

print("{}".format(xattr.__file__))
# '/usr/local/lib/python3.7/site-packages/xattr/__init__.py'


def showww_me_the_meta(file_name):
    """Using Python's XATTR to list Key Meta Names for File."""
    print("Showing Initial Names & Values.")
    attrz = xattr.listxattr(file_name)
    result = ("A. Info Showcased Init: {}".format(attrz))
    print("{}".format(result))
    return result


def update_the_meta(file_name):
    """Using Python's XATTR to Update Key Meta Names for File."""
    xattr.setxattr(file_name, 'custom.comment',
                   'I tawt I taw a puddy tat!.'.encode('utf-8'))
    xattr.setxattr(file_name, 'Music.Artist',
                   'I did! '
                   'I did taw a puddy tat!'.encode('utf-8'))
    get_the_meta_values(file_name)
    return


def get_the_meta_values(file_name):
    """Example."""
    print("B. Listing Meta for: {}".format(file_name))
    attrz = xattr.listxattr(file_name)
    print("")
    for i in reversed(attrz):
        abc = xattr.getxattr(file_name, i)
        result = ("{} : {}".format(i, abc))
        print("   {}".format(result))
    print("")
    return


def remove_the_meta(file_name):
    """Example."""
    xattr.removexattr(file_name, 'custom.comment')
    xattr.removexattr(file_name, 'Music.Artist')
    attrz = xattr.listxattr(file_name)
    result = ("C. Info Removed Meta: {}".format(attrz))
    print("{}".format(result))
    return result


if __name__ == '__main__':
    showww_me_the_meta('xattr_example.py')
    update_the_meta('xattr_example.py')
    remove_the_meta('xattr_example.py')

运行该文件的结果是:

$ python3 xattr_example.py
/usr/local/lib/python3.7/site-packages/xattr/__init__.py
Showing Initial Names & Values.
A. Info Showcased Init: ()
B. Listing Meta for: xattr_example.py

   custom.comment : b'I tawt I taw a puddy tat!.'
   Music.Artist : b'I did! I did taw a puddy tat!'

C. Info Removed Meta: ()

最后

关于"import xattr"在Python3中是否仍然有效?请注意,Python可以安装在不同的版本上并具有不同的路径。

python -V
# Python 2.7.16
which python
# /usr/local/bin/python

"and"
python3 -V
Python 3.7.4
which python3
/usr/local/bin/python3

当你有多个版本时,在调用python时,必须分别使用pythonpython3。我正在Mac OSX上工作,因此我有两个版本,但是这个脚本是用python3编写的。
参考文献: 希望有所帮助!祝您一切顺利!

我也将这个添加到了我的Github仓库 https://github.com/JayRizzo/Random_Scripts/blob/master/xattr_example.py - JayRizzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接