python - ModuleNotFoundError: No module named my package but I can find it in pip freeze
问题描述
I tried to make a custom package [(link)][1] like this
[ '|-- willytricks',
' |-- __init__.py',
' |-- directoryList.md',
' |-- setup.py',
' |-- trick.py',
' |-- build',
' | |-- bdist.linux-x86_64',
' |-- dist',
' | |-- willytricks-0.0.1-py3.6.egg',
' | |-- willytricks-0.0.1.tar.gz',
' |-- willytricks.egg-info',
' |-- PKG-INFO',
' |-- SOURCES.txt',
' |-- dependency_links.txt',
' |-- top_level.txt',
'
]
the setup.py :
import setuptools
setuptools.setup(
name="willytricks",
version="0.0.1",
author="wil75822",
author_email="lunasdejavu@gmail.com",
description="",
long_description=" useful python tools",
long_description_content_type="text",
url="www.ntu.edu.tw",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
then I type python setup.py sdist
sudo pip3 install "~/dist/willytricks-0.0.1.tar.gz"
I can find it by pip3 freeze
the information:
willytricks @ file:///data/workspace/willy_sung/willytricks/dist/willytricks-0.0.1.tar.gz
but I can't import willytricks
in python3
import willytricks
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'willytricks'
thank you guys! after following your tips I can import willytricks now but it shows another error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/data/workspace/willy_sung/myproject/dist/willytricks-0.0.1/willytricks/__init__.py", line 1, in <module>
from trick import *
ModuleNotFoundError: No module named 'trick'
what should I put inside of init.py? [1]: https://l.messenger.com/l.php?u=https%3A%2F%2Fdrive.google.com%2Ffile%2Fd%2F1rrS_JzOMcwx7b_-6xkF85Jo8GQnp3H0M%2Fview%3Fusp%3Dsharing&h=AT1V7YbJgVgstXoSU7qiD6wdO-rjPdcXjNJ6HVTWfZ0y-zNFF4nSiLBvXZRDU8OC05PiZZGg8V9VyecHgxUJdlrKR152cyh5VUALDtdFE4KZ3RQsfe8yR9rznQLflTbwr2o
解决方案
Python 分发包的名称不必与它们实际交付的脚本、模块和包的名称相同。当您运行setup.py
时,willytricks
它没有找到任何包,它构建了一个“willytricks”发行版,其中没有任何包。
如果我手动运行扫描仪,
>>> import os
>>> os.getcwd()
'/home/td/tmp/bbb/willytricks'
>>> import setuptools
>>> setuptools.find_packages()
[]
但是如果我返回一个目录并再次扫描,则会找到一个包
>>> os.chdir("..")
>>> os.getcwd()
'/home/td/tmp/packagedir'
>>> setuptools.find_packages()
['willytricks']
您需要将setup.py
不属于打包的所有内容移动到一个目录中。这个目录可以任意命名。事实上,它通常将其命名为与包相同的名称。使用源代码控制很常见,您可以同时在不同目录中签出这些文件的多个副本。
将您的结构更改为以下内容,它应该可以工作。
<projectdir>--|-- willytricks
| |-- __init__.py
| |-- trick.py
|-- directoryList.md
|-- setup.py
|-- build
...
|-- dist
...
|-- willytricks.egg-info
...
脚本和模块和包
python“包”是一个包含 .py 模块和子包的目录。不幸的是,我们最终谈论了包装包装。模块和包被安装到 python 已知的后台目录中(可能site-packages
或者dist-packages
在 python 发行版中的某个地方)。顶级脚本也是 .py 文件,但通常位于操作系统可以在系统中找到它们的位置PATH
。
由于您的软件包只有一个模块,因此您可以轻松地将其作为单个模块分发。如果您有多个要组合在一起的 python 模块,或者计划在将来这样做,您只需要一个包。对于单个模块分发,您可以返回原始结构并删除__init__.py
. 在setup.py
删除packages=setuptools.find_packages(),
和添加py_modules=["Tricks"],
. 现在,import tricks
会工作。您也可以将该 .py 重命名为willytricks.py
for import willytricks
to work。
推荐阅读
- java - 将文件转换为 Base64 后无法打开 XLS 文件
- php - Prestashop 1.7 邮件警报 ps_emailalerts.php 错误
- android - 在 Recyclerview 中实现复选框。MVVM Room ViewModel LiveData Recyclerview 复选框
- javascript - 覆盖this._secondaryEvents mousedown touchstart的函数为mousedown
- excel - 如何为包含特定评论的单元格返回单元格引用?
- c# - 在 aspnet 核心运行时检查托管服务器是 IIS 还是 Kestrel
- bash - 在目录中查找最新文件并制作副本
- python-3.x - 使用 Python 进行 60 GB(大容量)TDMS 文件分析
- python - tf.data vs keras.utils.sequence 性能
- excel - 仅当数据导出到的工作簿已关闭时才使用 msgbox BeforeClose 导出数据