【问题标题】:python setup tools console_scripts with argumentspython设置工具console_scripts带参数
【发布时间】:2017-04-06 20:12:12
【问题描述】:

我想在命令行上实现我的 pypy.py 脚本,我需要使用设置工具,但是由于我的 pypy.py 需要两个参数,所以 console_script 不能正常工作,请指导我如何正确修改它以工作推荐线。

python.py

def main(agru1, argu2):

    "do something"

 if __name__ == "__main__":
        main()

当我将它包含在我的 setup.py 文件中时,作为 console_script 如下

setup( 
     entry_points={
        'console_scripts': ['pypy = pypy.pypy:main'],
    }

)

当我在命令行上运行它时出现以下错误:

Traceback (most recent call last):
File "/usr/local/bin/python", line 9, in <module>
load_entry_point('Pypy==0.1', 'console_scripts', 'pypy')()
TypeError: main() takes at least 2 arguments (0 given)

【问题讨论】:

  • 您应该从sys.argv 获取参数。它们没有传入。您可以将参数解析库应用于它以使其处理选项等。

标签: python setuptools


【解决方案1】:

入口点必须是一个接受个参数的函数。如果你想从命令行传入参数,假设你想像这样调用它:

$ pypy a1 a2

您需要改为从sys.argv 读取它们。所以你的 python 模块应该包含这个:

def program(arg1, arg2):
    print(arg1, arg2)

def main():
    import sys
    arg1, arg2 = sys.argv[1], sys.argv[2]
    program(arg1, arg2)

if __name__ == "__main__":
    main()

如上运行该命令应将a1 a2 打印到控制台中。用户输入的错误处理是您自己的练习。

【讨论】:

  • 谢谢,我应该如何在 setup.py 中包含 main(sys.argv[1], sys.argv[2]) (如上所述)?如果我使用您的解释,错误仍然相同....!
  • setup.py 挂钩到 distutilssetuptools 和底层库有自己的 sys.argv 处理来处理命令,这几乎肯定会与你想这样做发生冲突.您是否尝试按原样运行我的代码?
  • 是的,之后我回复了,它的错误与上面问题中提到的相同。
  • 对,你的setup.py直接调用main,而不是直接调用script;因此修改main 方法,使其不接受任何内容,并使用参数将其传递给实际程序。
【解决方案2】:

和metatoaster的回答类似,不用sys.argv你可以用argsparsehttps://docs.python.org/3/library/argparse.html,这让argumnets的传递更加人性化。

import argparse


if __name__ == "__main__":
  parser = argparse.ArgumentParser()
  parser.add_argument('--arg1', help='arg1 help')
  parser.add_argument('--arg2', help='arg2 help')
  args = parser.parse_args()
  print("arg1 {}, arg2 {}".format(args.arg1, args.arg2)

这样称呼:

pypy --arg1 1 --arg2 2

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2017-01-09
    • 2012-06-28
    • 2012-09-08
    • 2020-11-12
    • 2013-12-09
    相关资源
    最近更新 更多