【问题标题】:Make CLI with argparse and setuptools使用 argparse 和 setuptools 制作 CLI
【发布时间】:2018-11-09 14:35:45
【问题描述】:

我有一个模块 sfind.py。我怎样才能做到这一点,以便我可以通过不带 py 前缀的文件名运行脚本?

 python sfind instead python sfind.py

sfind.py

import argparse


def createParser():
    some logic
    return parser

def main(namespace):
    some logic


if __name__ == '__main__':
    parser = createParser()
    namespace = parser.parse_args()
    main(namespace)

我尝试用 setuptools 来做,在同一目录中创建了新文件 setup.py。

setup.py

从 setuptools 导入设置

setup(
    name='sfind',
    version='0.1',
    packages=['sfind'],
    entry_points={
    'console_scripts': [
        'sfind=sfind:__main__'
    ]
})

但是发生了错误

python: can't open file 'sfind': [Errno 2] No such file or directory

谁能帮我做对吗?

文件结构:

-sfind
  --__init__.py
  --__main__.py
  --sfind.py
  --test.py

【问题讨论】:

  • 您运行的是python setup.py develop 还是python setup.py install?您不会对此使用命令python,它只是sfind <args>
  • 另外,这不会像 __main__ 一样执行 sfind.py。它将执行main() 函数,因为这是您指定的入口点。
  • @jordanm 如果我运行python setup.py install 我有同样的错误。我将 main 替换为 main

标签: python argparse setuptools


【解决方案1】:

您不需要 setuptools 将您的模块称为python sfind。 Setuptools 将允许您通过 sfind 拨打电话。要使用python sfind 调用它,您必须将sfind 设为一个模块,您可以通过在目录中使用__init__.py__main__.pysfind.py 创建一个python 目录sfind 来做到这一点。然后,您可以使用python sfind 拨打电话。如果您只想用sfind 调用它,您可以使用设置工具,但建议您提供可调用函数(例如sfind=sfind.sfind:main)而不是模块本身(__main__)作为entry_points。然后您可以执行python setup.py installpython setup.py sdist 然后pip install

【讨论】:

  • 感谢您如此详细的回复。然后我不明白为什么在调用python sfind 之后脚本没有运行。我的文件夹中有`__init__`文件。将程序视为模块就足够了吗?
  • @lepiloff 对不起,我忘了提到你需要在你的包中包含__main__.py,其中应该包括你的argparse
  • 我同时拥有__main__.py__init__.py 但总是:can't open file 'sfind': [Errno 2] No such file or directory
  • @lepiloff cd 到包含sfind 文件夹的目录并运行python sfind
  • 瑞奇金,是的。我在我的问题中添加了文件结构
猜你喜欢
  • 2014-04-07
  • 1970-01-01
  • 2014-11-30
  • 2011-06-05
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2017-04-26
相关资源
最近更新 更多