2017-02-28 58 views
3

我们有一个Python 2模块,我们使用python setup.py sdist构建,然后部署到远程计算机并使用pip install mymodule.tar.gz安装在virtualenv中。AttributeError:'module'对象没有属性'__file__'(使用pip安装模块)

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

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

在一台机器它正确打印到的virtualenv“站点包”内的位置的完整路径。在另一个非常类似的机器它提出:

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安装的软件包集合或pip安装后的“mymodule”文件系统的差异。我已经cd编辑到一个空文件夹,以确保我没有从cwd导入任何东西。

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

回答

0

问题的根源在于我们实际上是在安装两个模块,而Python似乎有排序模糊。我们设计和安装这两个模块作为单独的代码库:

mymodule 
mymodule.crazything 

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

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

我们的解决方案是:不要在子模块中创建单独的包,而是给它们单独的不冲突的模块标识。

相关问题