首页 > 解决方案 > 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

标签: pythonpython-3.xpippython-3.6

解决方案


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.pyfor import willytricksto work。


推荐阅读