在Python中使用subprocess和fab

3
我刚开始学习Python,并尝试使用subprocess在一个脚本中运行另一个脚本。我在网上找到了几个非常接近的资源,但不幸的是它们都无法帮助我成功运行我的代码。
这是我想做的事情: 在我的主脚本script1中,我正在创建一个fabfile.py(script2)。需要从script1执行此脚本2或fabfile.py。经过一些研究,我发现execfile和os.systems不是好的选择,因此我决定使用subprocess。(参考:如何使一个Python文件运行另一个文件?
这是我正在做但不起作用的内容:
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 \ndef task1(): \n    run('ls')")
import subprocess
host = raw_input("Enter the host IP with username e.g. root@10.0.0.2:")
p1 = subprocess.Popen(['fab', '-f path/fabfile.py', '-H host'],stdout=subprocess.PIPE)
output = p1.communicate()
print output

注意:在这行代码中
p1 = subprocess.Popen(['fab', '-f path/fabfile.py', '-H host'],stdout=subprocess.PIPE)

我尝试了很多不同的格式 - 引号和双引号的放置,使用$%表示变量等等。但是似乎都没有起作用。是否有什么错误之处? 我看到的例子通常很简单,并且没有使用变量作为参数。


你遇到了什么错误? - jaynp
考虑使用 Fabric 的 execute 方法:http://docs.fabfile.org/en/latest/api/core/tasks.html#fabric.tasks.execute - tobltobs
4个回答

4
  1. Don't specify python variables in string
  2. Separate flags

    p1 = subprocess.Popen(['fab', '-f', path+'/fabfile.py', '-H', host],stdout=subprocess.PIPE)
    
  3. When joining paths, its a better idea to use os.path.join()

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

0

我发现还有一个问题,那就是输入密码的问题。因为即使纠正了变量问题,我仍然会得到错误信息(不同的错误)。我认为,我可以简单地这样做,而不是使用fab:

from subprocess import Popen, PIPE 
host = raw_input("Enter the host IP with user e.g. root@10.0.0.2:") 
conn1 = Popen(['ssh',host,'ls'], stdin=PIPE) 
conn1.communicate('password') 

参考:使用subprocess发送密码


请开一个新问题,因为它完全不同,并查看此问题的答案。 - Xavier Combelle

0

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

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. root@10.0.0.2:")

env['host']=host
my_ssh_connection_blah()

-1

Python不会自动插值变量pathhost,您需要显式地进行操作。

更改为:

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

至:

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

'-f'path + '/fabfile.py' 以及 '-H'host 应该是不同的参数。 - Xavier Combelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接