我是一名Ruby程序员,正在开发我的第一个Python包(让我们称之为 foo )。其主要目的是作为命令行工具。我指定它应该在setup.py
中使用:
setup(
entry_points={
'console_scripts': [
'foo = foo.cli:main'
]
}
)
foo/cli.py
包含:
import foo
def main():
# program logic here
if __name__ == '__main__':
main()
cli.py
需要引用foo.__version__
中定义的foo/__init__.py
,但是当我在本地运行python foo/cli.py
来测试CLI时,import foo
会引发ImportError: No module named foo
}}。在运行像这样的单个文件时,如何让Python在foo包的上下文中看到cli.py?我的做法完全错了吗?您通常如何在本地测试使用setuptools的入口点定义的可执行文件?
答案 0 :(得分:1)
在包中,您可以直接导入__init__
,然后使用as
重命名。试试这个
import __init__ as foo
取代
import foo
答案 1 :(得分:1)
您缺少修改sys.path
或PYTHONPATH
变量以包含 foo / 所在的目录。
在运行 cli.py 文件之前的命令提示符下,执行以下操作
codepython@vm-0:~/python/foo$ PYTHONPATH=$PYTHONPATH:~/python/;export PYTHONPATH
在我的设置中 foo / 出现在〜/ python 中,并且存在 _ init _。py 在 foo / 中告诉python解释器 foo 是一个包而不是普通目录。
现在您可以cd
进入 foo / 目录,然后运行python cli.py
。您将能够访问 foo 包方法和函数。
或者在main()中,您可以先修改sys.path
以附加包含 foo / 的目录,然后执行其余的逻辑
引用Python documentation on Modules:
当导入名为spam的模块时,解释器首先进行搜索 对于具有该名称的内置模块。如果没有找到,则搜索 对于由。给出的目录列表中名为spam.py的文件 变量sys.path。 sys.path从这些位置初始化:
包含输入脚本(或当前目录)的目录。 PYTHONPATH(目录名列表,语法与 shell变量PATH)。依赖于安装的默认值。后 初始化,Python程序可以修改sys.path。目录 包含正在运行的脚本放在。的开头 搜索路径,在标准库路径之前。这意味着 将加载该目录中的脚本而不是加载的模块 库目录中的相同名称。这是一个错误,除非 打算替换。有关更多信息,请参见标准模块 信息。