2016-12-29 71 views
2

背景

我做的__file__属性从docs (scroll down to 'modules')是如何工作的一些研究,以及各种网站。进口第三方模块没有__file__属性

据我所知,所有的python模块只要从文件中加载就应该具有__file__属性。

我使用

(env)$ pip install opencafe 

安装第三方Python模块opencafe我利用这种测试框架的问题。

从CLI运行测试命令时会出现此问题。当该命令运行时,它会触发此文件: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中是否存在问题。

该文档明确指出:“对于静态链接到解释器的C模块,__file__属性不存在”。这个模块是一个本地安装的python模块。它没有链接到像sys模块这样的解释器。

[编辑]

这里是关于命名空间的包一些更多的好信息。

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

如果包作为一个命名空间包检查其__file__的属性,你可以告诉的主要途径。如果完全缺失,该包是一个命名空间。

最后更新

事实证明,opencafe不与virtualenv最新版本。它只适用于版本15.0.1或更早版本。恢复回去摆脱了这个错误消息对我来说。

安装此版本时,在virtualenv的软件包中创建了一个__init__.pyc文件。这个字节编译是如何得到它的信息__file__

回答

1

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

+0

既然如此,你会说这个问题确实与opencafe本身有关,因为它在其自己的模块之一中调用cafe .__ file__。除了每次安装操作该行外,是否还有其他解决方法? – gliemezis

+0

@gliemezis:它呢?奇怪的。我不认为它应该这样做。 – user2357112

+0

是的[在这里](https://github.com/openstack/opencafe/blob/master/cafe/configurator/managers.py#L613)。我同意这很奇怪。这不是最近的变化,但现在对我造成这个错误。 – gliemezis

4

这是因为opencafe不是一个正常的python模块。当你打开他们的主模块__init__时,你可以很容易地看到它。

declare_namespace明确创建了一个namespace包。欲了解更多关于此的信息,你可以访问PEP-382

+0

谢谢。我不熟悉命名空间包。既然如此,你会说这个问题确实与opencafe本身有关,因为它在其自己的模块中调用了“cafe .__ file__”。除了每次安装操作该行外,是否还有其他解决方法? – gliemezis

+0

请注意,PEP 382被拒绝。 – user2357112

+1

但[PEP 420](https://www.python.org/dev/peps/pep-0420/)不是。 – gliemezis

相关问题