我是python&的新手布。 我有一个python模块module1.py,它想要接受一个命令参数,我们在module1.py中使用argparse来要求一个命令行参数。 但是我们试图通过结构运行整个程序,如果我在运行fab时直接指定命令行,我得到了
mycode.py: error: argument --config_yaml is required
我怎么能通过fab传递参数?
谢谢!
答案 0 :(得分:1)
从我在这里可以看到:
https://github.com/fabric/fabric/blob/master/fabric/main.py#L340 https://github.com/fabric/fabric/blob/master/fabric/main.py#L619
你不能这样做。在main.py运行之前,您无法向env_options
添加内容,fabfile.py
中的代码将在main()
处理后运行。
但你可以这样做:
重命名fabfile.py
- >无论你想要什么,只要它不是fabric.py
。我打电话给我fabricc.py
from fabric.state import env_options, make_option
env_options.append(make_option('--myconfig', dest='config_file', default='default.ini'))
from fabric import main
from fabric.api import task, env
@task
def do_something():
print('config file: {}'.format(env.config_file))
if __name__ == '__main__':
main.find_fabfile = lambda x: __file__
main.main()
现在运行它:
$ python fabricc.py do_something
config file: default.ini
Done.
或..
$ python fabricc.py do_something --myconfig=somethinelse.ini
config file: somethinelse.ini
Done.
警告词不要称之为--config
- 这是一个内置的参数。
有了这个,你仍然可以享受你仍然喜欢的一切fabric
并且没有任何改变。
$ python fabricc.py do_something --help
Usage: fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...
Options:
-h, --help show this help message and exit
-d NAME, --display=NAME
...
-z INT, --pool-size=INT
number of concurrent processes to use in parallel mode
--myconfig=CONFIG_FILE
PS。我不建议你做织物覆盖手动处理它。我只是告诉你它可以完成。 (我不容忍这一点的原因是:兼容性。如果版本明天更改,可能中断)最好使用该产品的作者如何使用它。
=============================================== =====================
此外,面料是一个花哨的orm建设者 - 缺乏一个更好的词。你不能在每个任务的基础上拥有命令行参数,它不像那样工作。但它被设计为接受任务函数参数:
@task
def do_something(file=None):
print('config file: {}'.format(file or 'default.ini'))
$ fab dosomething:test
config file: override.ini
Done.
这就是创建面料的目的。
它意味着像这样使用:
@task
def environment(box_env=None):
...
@task
def deploy(branch='master'):
...
@task
def provision(recreate_if_existing=False, start_nignx=True):
...
fab evironment:dev deploy:development
fab evironment:dev provision:True,False
一起。
fab evironment:dev provision deploy:development
答案 1 :(得分:0)
我知道argparse
,但不知道fabric
。从错误看起来您的脚本定义了一个&#39; - config_yaml&#39; argparse
论证(并使其成为&#39;必需&#39;)。但fabric
显然也使用了该参数名称。
我不知道fabric
是否也使用argparse
。但是像这样的程序通常会剥离它所期望的命令行参数,并将其余部分传递给你的代码。
您是否需要在脚本中使用--config_yaml
?为什么设置为required=True
? argparse
允许您指定required
参数,但理想情况下标记的参数是可选的。如果没有给出,他们应该有合理的默认值。
我在--config=...
API中看到fabric
参数,但不是--config_yaml
。
我想知道关于每个任务参数的这一部分是否相关
http://docs.fabfile.org/en/1.10/usage/fab.html#per-task-arguments
听起来您需要将任务名称添加到参数中。 fabric
并不会将所有未知参数传递给任务(这是我上面假设的)。但我没有安装fabric
,因此无法对其进行测试。