我正在尝试向公众发布一个用 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.py
和 main.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 Generator
或 from .导入生成器
你应该能够清除这个问题。
关于python - 分发具有多个模块的 Python 命令行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22992856/