在Python包中测试可执行文件
我是一名Ruby程序员,正在开发我的第一个Python包(我们称之为foo)。它的主要用途是作为命令行工具。我指定它应该作为可执行文件安装在在Python包中测试可执行文件,python,command-line-interface,packages,setuptools,python-module,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 h
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.\uuuuu version\uuuuu
中定义的foo/\uuuuu init\uuuuuuuuuu.py
,但是当我在本地运行python foo/cli.py
来测试cli时,import foo
会引发ImportError:没有名为foo的模块。当运行这样的单个文件时,如何让Python在foo包的上下文中看到cli.py?我的方法完全错了吗?您通常如何在本地测试使用setuptools的入口点定义的可执行文件?在包中,您可以直接导入\uuuu init\uuuu
,然后使用重命名为
。试试这个
import __init__ as foo
代替
import foo
您缺少修改sys.path
或PYTHONPATH
变量以同时包含foo/所在的目录
在运行cli.py文件之前,在命令提示符下执行以下操作
codepython@vm-0:~/python/foo$ PYTHONPATH=$PYTHONPATH:~/python/;export PYTHONPATH
在我的设置中,foo/存在于~/python中,并且foo/中的\u init.py告诉python解释器,foo是一个包,而不是一个普通目录
现在您可以cd
进入foo/目录,然后运行pythoncli.py
。您将能够访问foo包方法和函数
或者,在main()中,您可以首先修改sys.path
以附加包含foo/的目录,然后执行其余逻辑
引述:
导入名为spam的模块时,解释器首先进行搜索
对于具有该名称的内置模块。如果未找到,则进行搜索
对于指定目录列表中名为spam.py的文件
变量sys.path。sys.path从以下位置初始化:
包含输入脚本的目录(或当前目录)。
PYTHONPATH(目录名列表,语法与
shell变量路径)。与安装相关的默认设置。之后
初始化时,Python程序可以修改sys.path。目录
包含正在运行的脚本的文件被放置在
搜索路径,位于标准库路径之前。这意味着
将加载该目录中的脚本,而不是
库目录中的相同名称。这是一个错误,除非
打算更换。有关更多信息,请参阅“标准模块”一节
信息
成功了!如果我还希望能够从cli.py内部访问foo包中的其他模块,该怎么办?比如说,如果我还有一个foo/baz.py
文件,并且我想从foo/cli.py
中访问一个名为“MyClass”的类?我尝试了从.baz导入MyClass的,但得到了值错误:尝试在非包中进行相对导入
。这让我觉得我在处理整个事情上是错的。例如,我相信你所需要的是来自baz import MyClass的,非常有用-谢谢!我在模块顶部添加了以下内容:这是本地测试CLI的标准方法吗?在实现代码中似乎有点难看。@JimmyCuadra不,你真的不需要这样做。如我在示例中所示,由于可以修改PYTHONPATH环境变量,因此可以编写一个简单的shell脚本,用所需的目录修改PYTHONPATH,然后执行要测试的python脚本。这样,您就不需要在脚本中编写难看的锅炉板代码,您的脚本可以在任何地方进行测试。使用shell脚本包装测试执行是否标准?在我所研究的开放源码Python库中,我还没有见过类似的东西。@JimmyCuadra我不确定这是否是一个标准。我提供的是解决您的用例的一种方法。然而,在这方面我看不到任何非标准的东西——如果您使用过Java,我们会在从ANT脚本执行测试之前设置类路径。我想,同样的类比在这里也适用,因为您测试的是单个脚本,而不是整个安装程序。