0

我是一名 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 的入口点定义的可执行文件?

4

2 回答 2

1

您缺少修改sys.pathorPYTHONPATH变量以包含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/的目录,然后执行其余逻辑

引用关于 Modules 的 Python 文档

当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。sys.path 从这些位置初始化:

包含输入脚本的目录(或当前目录)。PYTHONPATH(目录名称列表,与 shell 变量 PATH 具有相同的语法)。安装相关的默认值。初始化后,Python 程序可以修改 sys.path。包含正在运行的脚本的目录位于搜索路径的开头,位于标准库路径之前。这意味着将加载该目录中的脚本,而不是库目录中的同名模块。除非打算更换,否则这是一个错误。有关详细信息,请参阅标准模块部分。

于 2013-09-13T06:27:16.420 回答
1

在包中,您可以直接导入__init__,然后使用as. 尝试这个

import __init__ as foo

代替

import foo
于 2013-09-13T05:56:44.337 回答