【问题标题】:syntax error near unexpected token while use subprocess使用子进程时出现意外标记附近的语法错误
【发布时间】:2016-09-18 22:15:36
【问题描述】:

这个设计让我哭了,下面的代码,请帮助

def runbatch(CMD,HOST):
    print CMD
    print HOST
    for host in HOST:
        env.host_string=host
        print CMD
        print env.host_string
        print "Execute command : \"%s\" at Host : %s" %(CMD,host)
        print "-------------------------------------------------"
        p=subprocess.Popen("run('ls')",shell=True,
            stderr=subprocess.PIPE,
            stdin=subprocess.PIPE)
        output = p.communicate()
        print output

错误显示

(无,“/bin/sh: -c: line 0: 意外标记附近的语法错误'ls''\n/bin/sh: -c: line 0:run('ls')'\n”)

【问题讨论】:

  • 您是否尝试从您的 python 脚本运行命令ls?如果是这样,请尝试p=subprocess.Popen("ls",shell=True)。这应该将您当前的所有文件都列出到标准输出中。
  • ls 返回正常,但我需要使用 fabric run 命令列出远程主机

标签: python subprocess fabric


【解决方案1】:

subprocess.Popen() 在您的本地计算机上运行 bash 命令。 fabric 必须提供一种在本地机器上输入命令的方法,该命令被发送到远程机器并在其上运行。为此,您需要一个fabfile.py(现在,您需要将其准确命名为fabfile.py)来存储fabric fabric.api.run() 命令,这实际上是一个Python 命令而不是bash 命令。 fabric.api.run() 的参数是一个在远程机器上运行的 bash 命令。例如。 fabfile.py

from fabric.api import run
from fabric.api import env
def runcommand():
    run(env.my_command)

使用此示例,您可以使用命令行fab --set my_command=some_bash_command -H remote_host_ip runcommand 激活此远程调用。该字符串是您应该在脚本中传递给subprocess.Popen() 的字符串。例如。让我们将您的脚本称为stackoverflow.py,它接受一个命令行参数,即要在远程机器上执行的bash 函数

import subprocess
import sys

p=subprocess.Popen("fab --set my_command="+sys.argv[1]+" -H localhost runcommand",shell=True,
                    stderr=subprocess.PIPE,
                    stdin=subprocess.PIPE)
output = p.communicate()
print output

示例运行:

Chip chip@ 12:10:58@ ~: python stackoverflow.py ls
[localhost] Executing task 'runcommand'
[localhost] run: ls
[localhost] out: AllArms.py             fines
[localhost] out: Applications               github
[localhost] out: Box Sync               grades_assgn1
[localhost] out: DFExperiment               heuristic.py
[localhost] out: Desktop                    honour-project-in-thompson-sampling
[localhost] out: Documents              jags_bin
[localhost] out: Downloads              latemath
[localhost] out: Dropbox                    launchall.sh
[localhost] out: FIT3080                    launcher
[localhost] out: GaussianExperiments            launchucb.sh
[localhost] out: GoogleDrive                minuteSep5
[localhost] out: HierarchicalStan.py            minutes22aug
[localhost] out: IMG_6169.JPG               model1.pkl
[localhost] out: Library                    mydata
[localhost] out: Monarch                    notes15Aug2016
[localhost] out: Movies                 notesSep12
[localhost] out: Music                  old-honour
[localhost] out: PTSTuneBeta                oracle.R
[localhost] out: Pictures               paper
[localhost] out: Public                 parallelExperiments
[localhost] out: Samsung                    people_to_mark_first
[localhost] out: WindowFrame.class          rezaPhone
[localhost] out: WindowFrame.java           spike.py
[localhost] out: a.out                  stackoverflow.class
[localhost] out: aaai.tar.gz                stackoverflow.cpp
[localhost] out: all_experiments                stackoverflow.java
[localhost] out: api4.csv               stackoverflow.py
[localhost] out: atlas                  test
[localhost] out: boostlib               test.py
[localhost] out: codes_and_data.tar.gz          test.txt
[localhost] out: eclipse                    test1.html
[localhost] out: emo                    test2.html
[localhost] out: experimentlist             testlib.py
[localhost] out: fabfile.py             testlib.pyc
[localhost] out: fabfile.pyc                uselib.py
[localhost] out: file1                  uselib.pyc
[localhost] out: file2
[localhost] out: 


Done.
Disconnecting from localhost... done.
(None, "[localhost] Login password for 'hiennguyen': \n")

重要提示:以这种方式调用fab 时,您可能必须:

  1. 启用ssh 访问您的远程计算机。在这种情况下,远程机器只是localhost

  2. 有时,远程主机要求您输入密码,而您不会被提示输入密码(我的机器就是这种情况)。如果您稍等片刻却什么也看不到,您可能需要输入密码,然后按 ENTER。

【讨论】:

    猜你喜欢
    • 2011-05-27
    • 2017-12-03
    • 1970-01-01
    • 2022-12-20
    • 2013-12-31
    • 2012-08-31
    • 2012-10-20
    • 2012-09-29
    • 2013-12-11
    相关资源
    最近更新 更多