簡體   English   中英

在python中使用fab進行subprocess

[英]Using subprocess with fab in python

我是Python的新手,並嘗試使用子進程在另一個腳本中運行腳本。 我在網上找到了幾個非常接近的資源,但遺憾的是無法幫助我運行我的代碼而沒有錯誤。

這是我想要做的:在我的script1(主腳本)中,我正在創建一個fabfile.py(script2)。 需要從script1執行此腳本2或fabfile.py。 經過一番研究,我發現execfile和os.systems不是很好的選擇因此我決定使用子進程。 (參考: 如何讓一個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)

我嘗試了很多不同的格式 - 引用和雙引號放置, $%變量等等,但似乎沒有工作。 知道我做錯了什么嗎? 我看到的例子通常很簡單,沒有變量被用作參數。

  1. 不要在string中指定python變量
  2. 單獨的旗幟

     p1 = subprocess.Popen(['fab', '-f', path+'/fabfile.py', '-H', host],stdout=subprocess.PIPE) 
  3. 加入路徑時,最好使用os.path.join()

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

我發現還有一個問題,就是輸入密碼。 因為即使糾正了變量問題,我也會收到錯誤(另一個錯誤)。 我認為不是使用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') 

參考: 使用子進程發送密碼

代碼可能不是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()

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM