AttributeError:'模块'对象没有属性' __ file __' (使用pip安装自己的模块)

时间:2017-02-28 17:10:59

标签: python reflection pip

我们有一个使用python setup.py sdist构建的Python 2模块,然后部署到远程计算机并使用pip install mymodule.tar.gz安装在virtualenv中。

问题是:在一台机器上,生成的模块知道自己的文件路径 __file__ ,而在另一台机器上它不知道。测试案例如下:

python -c "import mymodule; print(mymodule.__file__)"

在一台机器上,它正确地打印到virtualenv" site-packages"内部位置的完整路径。在另一台非常相似的机器上,它提出了:

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

(有问题的计算机是运行Ubuntu 14.04的AWS EC2节点。)

尝试使用pkg_resources解决路径时出现问题 python -c "import pkg_resources; print(pkg_resources.resource_filename('mymodule', 'migrations'))" - 这应该提供模块代码的完整路径,但在有问题的计算机上无法正确解析。

我无法看到shell环境,pip安装的软件包集或者" mymodule"的文件系统之间存在任何差异。在它被pip安装之后。我cd编辑了一个空文件夹,以确保我没有从cwd导入任何内容。

我可以调查哪些差异来追踪此问题?如何确保我的pip install安装知道其文件路径的包?

1 个答案:

答案 0 :(得分:1)

问题的根源实际上是我们安装了两个模块,而Python似乎有排序歧义。我们将这两个模块设计并安装为单独的代码库:

mymodule
mymodule.crazything

换句话说,后者是一个独立的包,为mymodule添加了一个子模块。这意味着当编译后者时,它会创建一个没有内容的虚拟mymodule

安装这两个软件包时,安装了两个单独的mymodule模块。当您运行import mymodule时,其中哪一个将被使用?据我所知,这是由Python定义的,它是本地一致的,但在机器上并不一致。

我们的解决方案是:不要使用子模块创建单独的包。相反,我们为它们提供不会发生冲突的单独模块标识。