我已经对__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__
获取其信息的方式。