【问题标题】:ModuleNotFoundError: No module named my package but I can find it in pip freezeModuleNotFoundError:没有模块命名我的包,但我可以在 pip freeze 中找到它
【发布时间】:2020-10-30 03:38:56
【问题描述】:

我尝试制作自定义包 [(link)][1] 像这样

[ '|-- 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',
  '
]

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",
    ],
)

然后我输入python setup.py sdist

sudo pip3 install "~/dist/willytricks-0.0.1.tar.gz"

我可以通过pip3 freeze找到它 资料:

willytricks @ file:///data/workspace/willy_sung/willytricks/dist/willytricks-0.0.1.tar.gz

但我不能在 python3 中import willytricks

import willytricks
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'willytricks'

谢谢你们!遵循您的提示后,我现在可以导入 willytricks 但它显示另一个错误

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'

我应该在 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

【问题讨论】:

  • 您的发行版不包含任何包(带有__init__.py 的文件夹)。大多数库都包含一个以要导入的库命名的包。
  • setup.py 应该是 willytricks 之上的一个目录。

标签: python python-3.x pip python-3.6


【解决方案1】:

Python 分发包的名称不必与它们实际交付的脚本、模块和包的名称相同。当您在 willytricks 中运行 setup.py 时,它没有找到任何包,并且它构建了一个“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 已知的后台目录中(可能是 Python 发行版中的 site-packagesdist-packages)。顶级脚本也是 .py 文件,但通常位于操作系统可以在系统PATH 中找到它们的位置。

由于您的软件包只有一个模块,因此您可以轻松地将其作为单个模块分发。如果您有多个要组合在一起的 python 模块,或者计划在将来这样做,您只需要一个包。对于单个模块分发,您可以返回原始结构并删除 __init__.py。在setup.py 中删除packages=setuptools.find_packages(), 并添加py_modules=["Tricks"],。现在,import tricks 可以工作了。您还可以将该 .py 重命名为 willytricks.py 以使 import willytricks 正常工作。

【讨论】:

  • 非常感谢您的详细解释。我现在可以导入 willytricks 但我的 init.py 中有问题。其中只有一行“from trick import *”,trick 中的所有代码都是简单的函数。我应该在 init.py 中写什么?
  • 因为你只有一个模块,trick.py,你不需要用它做一个包。在您的原始目录结构中,您可以使用 py_modules = ["trick"] 仅分发模块。我会在答案中添加一些文字。
  • 如果您打算在未来将更多 .py 文件添加到您的技巧包中,请保留您现在正在做的事情。
猜你喜欢
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 2021-12-16
  • 2021-06-25
相关资源
最近更新 更多