我们有一个使用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
安装知道其文件路径的包?
答案 0 :(得分:1)
问题的根源实际上是我们安装了两个模块,而Python似乎有排序歧义。我们将这两个模块设计并安装为单独的代码库:
mymodule
mymodule.crazything
换句话说,后者是一个独立的包,为mymodule
添加了一个子模块。这意味着当编译后者时,它会创建一个没有内容的虚拟mymodule
。
安装这两个软件包时,安装了两个单独的mymodule
模块。当您运行import mymodule
时,其中哪一个将被使用?据我所知,这是由Python定义的,它是本地一致的,但在机器上并不一致。
我们的解决方案是:不要使用子模块创建单独的包。相反,我们为它们提供不会发生冲突的单独模块标识。