我正在尝试在我的一个python模块中为main方法创建一个入口点,并且似乎在导入该函数所在的模块时遇到了麻烦。
我的setup.py看起来像这样:
...
setup(name="awesome-tool",
...,
entry_points={
'console_scripts' : [
'awesome-tool = awesome_tool.awesome_tool:main'
]
}
)
项目的组织方式如下:
awesome_tool
|__ awesome_tool.py
|__ __init__.py
它是awesome_tool.py
,它包含一个名为main()的函数,我想在名为awesome-tool
的可执行文件中使用它。执行setup.py时,一切似乎都顺利。我可以启动python提示并执行
> import awesome_tool.awesome_tool
> # (all good here)
但是当我尝试从命令行调用awesome-tool
时,会发生这种情况:
Traceback (most recent call last):
File ".../virtualenvs/awesome-tool/bin/awesome-tool", line 9, in <module>
load_entry_point('awesome-tool==1.1.0', 'console_scripts', 'awesome-tool')()
File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 378, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 2566, in load_entry_point
return ep.load()
File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 2260, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named awesome_tool.awesome_tool
什么?我不能从python shell导入它吗?我怀疑python路径上有一些有趣的东西,但我无法诊断出问题。有什么想法吗?
awesome-tool
提供的setup.py
可执行文件中有问题的行似乎如下:
from pkg_resources import load_entry_point
load_entry_point("awesome-tool==1.1.0", "console_scripts", "awesome-tool")()
另外,我意识到让一个包和模块共享同一个名称(“awesome_tool”)是很奇怪的,但这是我继承的代码,我不想破坏向后重命名的兼容性,尽管这在未来可能是不可避免的。如果可能的话,我想保留现在的名字。
答案 0 :(得分:3)
看起来你没有以任何方式安装软件包,所以你依赖它发生在当前工作目录或你添加到sys.path
的其他目录中。
您没有告诉我们您是如何“从命令行调用awesome-tool
的”,但我的猜测是您是从另一个工作目录中执行此操作。
例如:
$ cd ~/virtualenvs/awesome-tool
$ python
>>> import awesometool.awesometool
>>> ^D
$ cd ..
$ python
>>> import awesometool.awesometool
ImportError: No module named awesome_tool.awesome_tool
$ cd awesome-tool
$ python ./bin/awesome-tool
<everything works>
$ cd bin
$ python awesome-tool
ImportError: No module named awesome_tool.awesome_tool
答案 1 :(得分:0)
如果您安装了带有 setup.py
标志的 --editable
文件
例如:
pip install --editable .
您必须在没有 --editable
标志的情况下再次安装软件包。
pip install .
它不会影响您在包中本地所做的更改。