python - 分发具有多个模块的 Python 命令行程序

标签 python python-3.x

我正在尝试向公众发布一个用 Python 编写的命令行程序,但首先想对其进行测试以确保该程序按我的预期运行。为此,我创建了一个简单的 wheel 程序发行版,在另一个目录中创建一个 virtualenv 实例,并将 wheel 安装到所述环境中。很容易,对吧?

并非如此。

当我尝试在测试环境中调用该程序时,收到以下错误消息:

Traceback (most recent call last):
  File "~/testing/bin/leprechaun", line 7, in <module>
    from leprechaun.main import main
  File "~/testing/lib/python3.4/site-packages/leprechaun/main.py", line 8, in <module>
    import generator
ImportError: No module named 'generator'

因此,似乎由于某种原因没有导入 generator.py 文件。但奇怪的是,generator.pymain.py(程序的主入口点)存在于同一目录中。

作为引用,这是我的项目的树层次结构:

├── leprechaun
│   ├── data
│   │   └── A bunch of text files that aren't important
│   ├── db.py
│   ├── generator.py
│   ├── __init__.py
│   ├── main.py
│   └── rainbow.py
├── LICENSE.txt
├── MANIFEST.in
├── README.rst
└── setup.py

还有,为了好玩,我的 setup.py 脚本:

#!/usr/bin/env python3

import re
from setuptools import setup, find_packages

version = re.search("^__version__\s*=\s*\"(.*)\"$",
  open("leprechaun/__init__.py").read(), re.M).group(1)

setup(
  name='leprechaun',
  version=version,
  description="A simple rainbow table generator",
  long_description=open("README.rst", encoding="utf-8").read(),
  author="My Name",
  author_email="My Email",
  url="https://github.com/zcdziura/leprechaun",
  license="MIT",
  packages=find_packages(),
  package_data={
    "leprechaun": ["data/wordlist*"]
  },
  entry_points={
    "console_scripts": [
      "leprechaun = leprechaun.main:main"
    ]
  }
)

我假设生成的入口点脚本只会从我的包中调用 main 函数,然后该函数就能够从同一目录导入模块。然而,事实似乎并非如此。

我该如何解决这个问题?

最佳答案

您面临的问题涉及绝对导入。您可能想看看this PEP了解有关其背后原理的更多信息。

简短的回答是,您现在所做的每个导入语句都会沿着 sys.path 查找。在 Python 2.x 中,您可以使用导入生成器,它会在当前目录中查找,而 Python 3.x 要求它沿着路径查找。因此,如果您更改为 from leprechaun import Generatorfrom .导入生成器你应该能够清除这个问题。

关于python - 分发具有多个模块的 Python 命令行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992856/

相关文章:

python - NLTK研究课题

python - 在 Flask 框架中设置全局属性

python - 实现保留文档字符串的类属性

python - Python 可停止线程是否需要守护进程或 .join()?

python - 无法在 python 3.6 中将字符串转换为 float

python-2.7 - 如何在 DSX 中提供用户功能/模块

python - 如何对 CSV 中的唯一 COL2 和 COL3 值中的唯一 COL1 值进行分组

python - 转换后如何取回分类数据?

python - 使用 wxpython 传递参数来创建窗口?

python - Python 中的生成器问题