我试图向公众发布用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.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
函数,然后就可以从同一目录中导入模块。但是,情况似乎并非如此。
我该如何解决这个问题?
答案 0 :(得分:1)
您面临的问题涉及绝对进口。您可能需要查看this PEP以获取有关其背后的基本原理的更多信息。
简短的回答是,您现在生成的每个导入语句都会显示sys.path
。而在Python 2.x中,您可以使用import generator
,它将在当前目录中查找,Python 3.x要求它沿着路径。因此,如果您更改为from leprechaun import generator
或from . import generator
,您应该能够清除它。