V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
LeIYc
V2EX  ›  Python

求助!!!使用 fabric 的时候遇到问题。

  •  1
     
  •   LeIYc · 2018-04-11 16:48:02 +08:00 · 2329 次点击
    这是一个创建于 2200 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想写个脚本,随机获取 5 个文件,然后用 fabric 把这 5 个文件复制到其他地方。
    前面获取文件终于搞好了,但是突然发现 fabric 执行 local()或者 run()命令的时候好想不能传入参数,是这样吗?
    反正我以前写的()里面都是字符形的内容。
    有没有其他方法可以实现传入参数执行,centos7 环境下。
    还要从其他设备上获取相同文件名的 5 个文件到本地。
    有人遇到过这类问题的吗。
    def cp_file(pesq_file,f_name):
    with lcd(pesq_file):
    local("cp。。。。。。。。。")
    第 1 条附言  ·  2018-04-13 10:37:10 +08:00
    在 fab 文件定义函数的时候如果同时向函数内传入参数的话,貌似会对本来模块自动传入的类似 env 的参数产生干扰,所以总是提示说没找到 env.hosts。
    另外在脚本最后指定 if __name__ =='__main__':下面执行的时候
    execute(cp_file(a))、cp_file(a) 这两中方法都能执行成功,但是都会提示没找到 hosts。
    不传入参数的话,怎么调用需要的列表呢?在函数里面执行产生列表的函数,然后调用这个函数的返回值?这样可以吗?
    10 条回复    2018-04-13 20:58:55 +08:00
    julyclyde
        1
    julyclyde  
       2018-04-11 17:08:57 +08:00
    你这问题跟 fabric 就没啥关系
    跨机器复制本来也不是用 cp 命令

    http://docs.fabfile.org/en/1.14/api/core/operations.html
    用 fabric 的 put
    LeIYc
        2
    LeIYc  
    OP
       2018-04-11 17:29:35 +08:00
    @julyclyde
    这里 local("cp .....") 命令在括号内的都是写在引号内的。这样的话我想操作 f_name 所代表的文件 的话要怎么写?
    解决了这个 run ()、put () 就都懂了。
    pengyou1woodat
        3
    pengyou1woodat  
       2018-04-12 20:13:53 +08:00
    为什么不能传入参数呢? run()中的 command 参数可以传入任意字符串
    LeIYc
        4
    LeIYc  
    OP
       2018-04-13 09:58:59 +08:00
    @pengyou1woodat
    我把 run 命令放在一个循环里面了。对列表所有元素执行 run 命令。文件中指定了
    env.hosts = ['172.16......']
    env.password = ['passwd']
    env.user = ['user']
    但是执行的时候总是提示我需要手动输入 hosts
    No hosts found. Please specify (single) host string for connection:
    我执行其他函数的时候就可以读取 hosts 这是为什么?
    LeIYc
        5
    LeIYc  
    OP
       2018-04-13 10:34:06 +08:00
    找到问题原因了。在 fab 文件定义函数的时候如果同时向函数内传入参数的话,貌似会对本来模块自动传入的类似 env 的参数产生干扰,所以总是提示说没找到 env.hosts。
    另外在脚本最后指定 if __name__ =='__main__':下面执行的时候
    execute(cp_file(a))、cp_file(a) 这两中方法都能执行成功,但是都会提示没找到 hosts。
    不传入参数的话,怎么调用需要的列表呢?在函数里面执行产生列表的函数,然后调用这个函数的返回值?这样可以吗?
    LeIYc
        6
    LeIYc  
    OP
       2018-04-13 10:35:57 +08:00
    有没有写过类似脚本的人啊。求指点迷津啊。。。。。。
    julyclyde
        7
    julyclyde  
       2018-04-13 19:55:04 +08:00
    你先搞明白什么叫 local(),它的参数是字符串形式的一条命令,具体命令什么意思不是由 fabric 说了算的,是由 shell 说了算的。如果你能写出来“跨机器复制文件”这个功能,那自然可以用 local 来调用它;你如果写不出来,那就不能用

    从你的提问上来看,你大概是不知道 scp 命令的,所以你不该用 local()

    你不要抱着“除了 local()和 run()以外我都拒绝用”的态度来思考问题。你这前提根本就是错的
    LeIYc
        8
    LeIYc  
    OP
       2018-04-13 20:49:54 +08:00
    @julyclyde
    总算在下班前搞出来了。用这个 env.host_string = 指定 ip 就可以了。之前还总把 put 和 get 给搞混。试了半天才发现用错命令了ヾ(๑╹◡╹)ノ"
    julyclyde
        9
    julyclyde  
       2018-04-13 20:52:02 +08:00
    @LeIYc

    还是多看看文档,理解运行方式
    你之前的提问,并没有说清楚文件的源路径和目标路径是不是同一台机器啊
    LeIYc
        10
    LeIYc  
    OP
       2018-04-13 20:58:55 +08:00
    @julyclyde
    确实还是看书少的缘故。
    而且全公司就我一个人在搞这个。遇到问题连个讨论的人都没有 。现翻书吧,又不好找。坑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1005 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:52 · PVG 06:52 · LAX 15:52 · JFK 18:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.