Python 3.x 控制台脚本执行时发生ModuleNotFoundError 发生了什么事

Python 3.x 控制台脚本执行时发生ModuleNotFoundError 发生了什么事,python-3.x,setuptools,Python 3.x,Setuptools,我有一个用Python 3(Python 3.6.0解释器)编写的简单CLI项目,我可以直接从命令行使用包和模块名运行该项目,但在安装setuptools时失败: #成功 ❯ python-m myProject.cli--版本 0.0.1.dev0 #故障 ❯ mycli--版本 回溯(最近一次呼叫最后一次): 文件“/path/myProject/venv/bin/mycli”,第11行,在 加载入口点('myProject==0.0.1.dev0','console\u scripts'

我有一个用Python 3(Python 3.6.0解释器)编写的简单CLI项目,我可以直接从命令行使用包和模块名运行该项目,但在安装
setuptools
时失败:

#成功
❯ python-m myProject.cli--版本
0.0.1.dev0
#故障
❯ mycli--版本
回溯(最近一次呼叫最后一次):
文件“/path/myProject/venv/bin/mycli”,第11行,在
加载入口点('myProject==0.0.1.dev0','console\u scripts','mycli')()
文件“/path/myProject/venv/lib/python3.6/site packages/pkg_resources/__init__.py”,第560行,加载入口点
返回获取分布(dist)。加载入口点(组、名称)
文件“/path/myProject/venv/lib/python3.6/site packages/pkg_resources/__init__.py”,第2648行,加载入口点
返回ep.load()
文件“/path/myProject/venv/lib/python3.6/site packages/pkg_resources/_init__.py”,第2302行,已加载
返回self.resolve()
文件“/path/myProject/venv/lib/python3.6/site packages/pkg_resources/_init__.py”,第2308行,解析中
module=\uuuu导入(self.module\u name,fromlist=[''\uuuu name\uuuuuuu'],级别=0)
ModuleNotFoundError:没有名为“myProject”的模块
项目设置 该项目的结构如下:

.
├── myProject
│   └── cli.py
└── setup.py
我希望以后将脚本安装为
mycli
,因此我的
setup.py
如下所示:

从setuptools导入设置中,查找\u包
从myProject.cli导入\uu版本__
设置(
#包裹信息
名称='myProject',
版本=\uuuu版本\uuuuu,
packages=find_packages(),
#依赖关系
安装\u需要=[
“docopt>=0.6.2”
],
#脚本信息
入口点={
“控制台脚本”:[
'mycli=myProject.cli:main'
]
}
)
装置 安装完成,没有错误:

❯ python setup.py install
running install
running bdist_egg
running egg_info
writing myProject.egg-info/PKG-INFO
writing dependency_links to myProject.egg-info/dependency_links.txt
writing entry points to myProject.egg-info/entry_points.txt
writing requirements to myProject.egg-info/requires.txt
writing top-level names to myProject.egg-info/top_level.txt
reading manifest file 'myProject.egg-info/SOURCES.txt'
writing manifest file 'myProject.egg-info/SOURCES.txt'
installing library code to build/bdist.macosx-10.12-x86_64/egg
running install_lib
warning: install_lib: 'build/lib' does not exist -- no Python modules to install

creating build/bdist.macosx-10.12-x86_64/egg
creating build/bdist.macosx-10.12-x86_64/egg/EGG-INFO
copying myProject.egg-info/PKG-INFO -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO
copying myProject.egg-info/SOURCES.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO
copying myProject.egg-info/dependency_links.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO
copying myProject.egg-info/entry_points.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO
copying myProject.egg-info/requires.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO
copying myProject.egg-info/top_level.txt -> build/bdist.macosx-10.12-x86_64/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating 'dist/myProject-0.0.1.dev0-py3.6.egg' and adding 'build/bdist.macosx-10.12-x86_64/egg' to it
removing 'build/bdist.macosx-10.12-x86_64/egg' (and everything under it)
Processing myProject-0.0.1.dev0-py3.6.egg
Removing /path/myProject/venv/lib/python3.6/site-packages/myProject-0.0.1.dev0-py3.6.egg
Copying myProject-0.0.1.dev0-py3.6.egg to /path/myProject/venv/lib/python3.6/site-packages
myProject 0.0.1.dev0 is already the active version in easy-install.pth
Installing mycli script to /path/myProject/venv/bin

Installed /path/myProject/venv/lib/python3.6/site-packages/myProject-0.0.1.dev0-py3.6.egg
Processing dependencies for myProject==0.0.1.dev0
Searching for docopt==0.6.2
Best match: docopt 0.6.2
Adding docopt 0.6.2 to easy-install.pth file

Using /path/myProject/venv/lib/python3.6/site-packages
Finished processing dependencies for myProject==0.0.1.dev0
pip show
还向我显示了预期结果:

❯ pip show myProject
Name: myProject
Version: 0.0.1.dev0
Location: /path/myProject/venv/lib/python3.6/site-packages/myProject-0.0.1.dev0-py3.6.egg
Requires: docopt
然而,
ModuleNotFoundError:当我执行
mycli
时,没有名为“myProject”的模块总是弹出错误


我非常感谢任何指点。

我找到了解决问题的方法,我认为这是一种误解

本页说明,自Python 3.3以来:

查找名为“foo”的模块或包时,对于父路径中的每个目录:

  • 如果找到/foo/\uuuuu init\uuuuuu.py,则导入并返回常规包
  • 如果未找到,但找到了/foo,并且是一个目录,则会记录该目录,并继续扫描父路径中的下一个目录
如果扫描完成而未返回模块或包,并且至少记录了一个目录,则创建一个命名空间包。新命名空间包:

  • 将_path _属性设置为扫描期间找到并记录的路径字符串的iterable
  • 没有_文件_属性
如本规范所定义:

命名空间包是只包含其他包和模块的包,没有自己的直接内容

正如我所描述的那样,我的方案属于这一类,这是无意的

myProject/
目录下添加一个空的
\uuuu init.py\uuuu
后,我在
安装步骤中看到这种情况:

❯ python setup.py build    
running build
running build_py
creating build/lib
creating build/lib/myProject
copying myProject/__init__.py -> build/lib/myProject
copying myProject/cli.py -> build/lib/myProject
之前:

>>> myProject.__path__
_NamespacePath(['/path/myProject'])
>>> myProject.__file__
AttributeError: module 'myProject' has no attribute '__file__'
之后:

>>> myProject.__path__
['/path/myProject']
>>> myProject.__file__
'/path/myProject/__init__.py'