导入的第三方模块没有__file__属性

时间:2016-12-29 17:31:32

标签: python python-2.7

背景

我已经对__file__属性以及docs (scroll down to 'modules')和各种网站的工作方式进行了一些研究。

根据我的理解,所有python模块都应该具有__file__属性,只要它从文件加载即可。

问题

我正在使用

安装第三方python模块opencafe
(env)$ pip install opencafe

我正在使用这个测试框架。

从CLI运行test命令时会出现此问题。运行该命令时,它会触发此文件:env/lib/python2.7/site-packages/cafe/configurator/managers.py

在该文件中有

import cafe

以及稍后

_PLUGIN_DIR = os.path.join(os.path.dirname(cafe.__file__), 'plugins')

运行此文件时,会发生此错误:

AttributeError: 'module' object has no attribute '__file__'

在这种情况下会发生同样的错误:

(env) $ pip install opencafe
Collecting opencafe
  Using cached opencafe-0.3.1-py2.py3-none-any.whl
Installing collected packages: opencafe
Successfully installed opencafe-0.3.1
(env) $ python
Python 2.7.10 (default, Jul 30 2016, 18:31:42)
>>> import cafe
>>> cafe.__file__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '__file__'

我的想法

我自然倾向于认为这是opencafe本身的问题,因为我只是安装框架并从CLI运行测试命令。

但是,我想知道安装到虚拟环境或PYTHONPATH是否存在问题。

文档明确指出&#34; __file__属性不存在于静态链接到解释器的C模块中。该模块是本地安装的python模块。它没有像sys模块那样链接到解释器。

[编辑]

以下是有关命名空间包的更多信息。

http://chimera.labs.oreilly.com/books/1230000000393/ch10.html#_discussion_172

  

如果包用作命名空间包,您可以判断的主要方法是检查其__file__属性。如果它完全丢失,那么包就是命名空间。

最终更新

事实证明,opencafe不适用于virtualenv的最新版本。它仅适用于版本15.0.1或更早版本。恢复后退了我的错误信息。

使用此版本安装时,在virtualenv中的包中创建了__init__.pyc文件。此字节编译是__file__获取其信息的方式。

2 个答案:

答案 0 :(得分:4)

那是因为opencafe不是普通的python模块。打开主模块__init__时,您可以轻松看到这一点。

declare_namespace显式创建了一个namespace包。有关此内容的更多信息,请访问PEP-382

答案 1 :(得分:1)

它是一个名称空间包,一种奇怪的包,可以分成多个目录。由于这种分裂机制,它不应该有__file__