Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python包中测试可执行文件_Python_Command Line Interface_Packages_Setuptools_Python Module - Fatal编程技术网

在Python包中测试可执行文件

在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

我是一名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.\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脚本执行测试之前设置类路径。我想,同样的类比在这里也适用,因为您测试的是单个脚本,而不是整个安装程序。