关于fabric:在python中使用fab进行subprocess

Using subprocess with fab in python

我不熟悉python,尝试使用子流程在另一个脚本中运行脚本。我在网上找到了一些非常接近的资源,但不幸的是,还不能帮助我正确地运行代码。

我想做的是:在我的脚本1(主脚本)中,我正在创建fabfile.py(脚本2)。此script2或fabfile.py需要从script1执行。经过一些研究,我发现execfile和os.systems不是很好的选择,因此我决定使用子流程。(参考:如何使一个python文件运行另一个文件?)

以下是我正在做但不工作的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from os.path import expanduser
home = expanduser("~")
import os
os.getcwd()
desk ="/Desktop"
path = str(home)+str(desk)
f = open("fabfile.py","w") # Creating a fabfile.py
f.write("from fabric.api import run
def task1():
    run('ls')"
)
import subprocess
host = raw_input("Enter the host IP with username e.g. [email protected]:")
p1 = subprocess.Popen(['fab', '-f path/fabfile.py', '-H host'],stdout=subprocess.PIPE)
output = p1.communicate()
print output

注:在线

1
p1 = subprocess.Popen(['fab', '-f path/fabfile.py', '-H host'],stdout=subprocess.PIPE)

我尝试过很多不同的格式——引号和双引号放置,$%用于变量等,但似乎没有一个有效。知道我做错什么了吗?我看到的例子通常很简单,没有变量被用作参数。


  • 不要在字符串中指定python变量
  • 分开的标志

    1
    p1 = subprocess.Popen(['fab', '-f', path+'/fabfile.py', '-H', host],stdout=subprocess.PIPE)
  • 当连接路径时,最好使用os.path.join()。

    1
    fab_file = os.path.join(os.path.expanduser("~"),"Desktop", 'fabfile.py')


  • 代码可能不是100%正确的,但这样的代码应该可以工作。

    1
    2
    3
    4
    5
    6
    7
    8
    import fabric.api as api
    from path.my-other-fabfile import my_ssh_connection_blah

    api.ls()
    host = raw_input("Enter the host IP with username e.g. [email protected]:")

    env['host']=host
    my_ssh_connection_blah()


    我发现还有一个问题,即输入密码。因为即使纠正了变量问题,我也会得到错误(另一个错误)。我想我可以不使用晶圆厂,而直接使用晶圆厂,

    1
    2
    3
    4
    from subprocess import Popen, PIPE
    host = raw_input("Enter the host IP with user e.g. [email protected]:")
    conn1 = Popen(['ssh',host,'ls'], stdin=PIPE)
    conn1.communicate('password')

    参考:使用子进程发送密码


    python不会为您插入变量pathhost,您需要显式地这样做。

    更改:

    1
    p1 = subprocess.Popen(['fab', '-f path/fabfile.py', '-H host'],stdout=subprocess.PIPE)

    到:

    1
    p1 = subprocess.Popen(['fab', '-f ' + path + '/fabfile.py', '-H ' + host],stdout=subprocess.PIPE)