在Python包中测试可执行文件

时间:2013-09-13 05:46:06

标签: python command-line-interface packages setuptools python-module

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

2 个答案:

答案 0 :(得分:1)

在包中,您可以直接导入__init__,然后使用as重命名。试试这个

import __init__ as foo

取代

import foo

答案 1 :(得分:1)

您缺少修改sys.pathPYTHONPATH变量以包含 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。目录   包含正在运行的脚本放在。的开头   搜索路径,在标准库路径之前。这意味着   将加载该目录中的脚本而不是加载的模块   库目录中的相同名称。这是一个错误,除非   打算替换。有关更多信息,请参见标准模块   信息。