5

我是 Python 新手,所以请帮助我...

#!/usr/bin/python -tt

import sys
import commands

def runCommands():
  f = open("a.txt", 'r')
  for line in f:  # goes through a text file line by line
    cmd = 'ls -l ' + line 
    print "printing cmd = " + cmd,
    (status, output) = commands.getstatusoutput(cmd)
  if status:    ## Error case, print the command's output to stderr and exit
      print "error"
      sys.stderr.write(output)
      sys.exit(1)
  print output
  f.close()

def main():
  runCommands()

# Standard boilerplate at end of file to call main() function.
if __name__ == '__main__':
  main()

我按如下方式运行它:

$python demo.py
sh: -c: line 1: syntax error near unexpected token `;'
sh: -c: line 1: `; } 2>&1'
error

跑步less $(which python)说:

#!/bin/sh bin=$(cd $(/usr/bin/dirname "$0") && pwd) exec -a "$0" "$bin/python2.5" "$@"

如果我删除for loop然后它工作正常

$cat a.txt
dummyFile


$ls -l dummyFile
-rw-r--r-- 1 blah blah ...................

$python demo.py
printing cmd = ls -l dummyFile
sh: -c: line 1: syntax error near unexpected token `;'
sh: -c: line 1: `; } 2>&1'
error

我使用 'ls' 只是为了显示问题。实际上我想使用一些内部 shell 脚本,所以我只能以这种方式运行这个 python 脚本。

4

4 回答 4

6

问题是由这一行引起的:

    cmd = 'ls -l ' + line

应修改为:

    cmd = 'ls -l ' + line.strip() 

当您从文本文件中读取该行时,您还读取了结尾的\n. 您需要剥离它以使其正常工作。getstatusoutput()不喜欢尾随的换行符。请参阅此交互式测试(这是我验证它的方式):

In [7]: s, o = commands.getstatusoutput('ls -l dummyFile')

In [8]: s, o = commands.getstatusoutput('ls -l dummyFile\n')
sh: Syntax error: ";" unexpected
于 2012-06-05T15:59:43.837 回答
2

这似乎是“python”命令的问题,也许它是一个 shell 包装脚本或其他东西。

$ less $(which python)

更新

尝试直接调用 Python 可执行文件,它似乎位于/usr/bin/python2.5

$ /usr/bin/python2.5 demo.py
于 2012-06-05T15:56:41.310 回答
1

commands 模块的文档指出,当您运行时getstatusoutput(cmd)

cmd实际上运行为{ cmd ; } 2>&1

这应该解释; } 2>&1来自哪里。

我的第一个猜测是,问题是由于没有从您从文件中读取的每一行的末尾剥离换行符,因此您实际运行的命令类似于

{ ls -l somedir
; } 2>&1

但是,我不太了解 shell 编程,所以我不知道如何sh处理{ ... }两行拆分的内容,也不知道为什么现在有两行时它会在第 1 行报告问题。

第二个猜测是你的文件中有一个空行,在这种情况下sh可能会抱怨,因为它正在寻找一个参数,ls而是找到; } 2>&1了。

第三个猜测是其中一个文件包含 a },或者可能是 a;后跟 a }

最终,如果没有看到文件的内容,我无法确定问题出在哪里a.txt

顺便说一句,我希望这个文件不包含 line / && sudo rm -rf /,因为这可能会给您带来一两个问题。

于 2012-06-05T16:45:06.593 回答
1

从其他地方得到这个答案:

当您作为迭代器遍历文件时,不会删除换行符。以下实际上是您的脚本正在执行的内容。您的打印语句中有一个尾随逗号(以及您的输出中的换行符)这一事实是赠品。

ls -l dummyFile \n

哪些命令解释为

{ ls -l dummyFile
; } 2>&1

调用 line.rstrip() (或只是剥离)来修复它。

cmd = 'ls -l ' + line.strip()
于 2012-06-05T17:00:38.747 回答