【发布时间】:2016-04-20 14:08:09
【问题描述】:
我的项目结构如下:
project
|-project.py
|-__init__.py
|-setup.py
|-lib
|-__init__.py
|-project
|-__init__.py
|-tools.py
project.py:
from project.lib import *
def main():
print("main")
tool()
if __name__ == "__main__":
main()
setup.py:
from setuptools import setup
setup(
name = "project",
version="1.0",
packages = ["project", "project.lib"],
package_dir = {"project": ".", "project.lib": 'lib/project'},
entry_points={
'console_scripts': [
'project = project.project:main',
],
},
)
tools.py:
def tool():
print("tool")
如果我跑了
import project.lib.tools
project.lib.tools.tool()
它按预期工作,但运行命令 project 失败
Traceback (most recent call last):
File "/usr/local/bin/project", line 9, in <module>
load_entry_point('project==1.0', 'console_scripts', 'project')()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 568, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2720, in load_entry_point
return ep.load()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2380, in load
return self.resolve()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2386, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "build/bdist.linux-x86_64/egg/project/project.py", line 3, in <module>
ImportError: No module named lib
我不明白为什么两个解释器没有相同的默认导入路径。
这个设置的原因是我希望能够import project.lib.tools,但保持lib/project的目录结构。
完整的 distutils 文档严重地没有说明如何在分发包后导入包(setuptools 和 distutils 的区别同样神秘 - 无法知道是否distutils 的行为是否在此处扩展)。
我在 Ubuntu 15.10 上使用 setuptools 18.4-1 和 python 2.7。
如果我按照@AnttiHaapala 的回答中的建议更改项目结构和setup.py,我会得到
$ project
Traceback (most recent call last):
File "/usr/local/bin/project", line 9, in <module>
load_entry_point('project==1.0', 'console_scripts', 'project')()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 568, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2720, in load_entry_point
return ep.load()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2380, in load
return self.resolve()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2386, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "build/bdist.linux-x86_64/egg/project/project.py", line 3, in <module>
ImportError: No module named lib
【问题讨论】:
标签: python python-2.7 import setuptools