使用多个模块分发Python命令行程序

时间:2014-04-10 15:48:02

标签: python python-3.x

我试图向公众发布用Python编写的命令行程序,但首先要测试它以确保程序按照我的意图运行。为此,我创建了一个简单的wheel程序分发,在另一个目录中创建virtualenv实例,并将wheel安装到所述环境中。容易,对吧?

不是这样。

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

Traceback (most recent call last):
  File "/home/zcdziura/testing/bin/leprechaun", line 7, in <module>
    from leprechaun.main import main
  File "/home/zcdziura/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函数,然后就可以从同一目录中导入模块。但是,情况似乎并非如此。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您面临的问题涉及绝对进口。您可能需要查看this PEP以获取有关其背后的基本原理的更多信息。

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