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」を使用しています。実際には、いくつかの内部シェル スクリプトを使用したいので、この 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」コマンドの問題のようです。おそらく、シェル ラッパー スクリプトか何かです。

走る

$ less $(which python)

更新

Python 実行可能ファイルを直接呼び出してみてください/usr/bin/python2.5

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

他の場所からこの回答を得ました:

ファイルを反復子として反復処理する場合、改行は削除されません。以下は、実際にスクリプトが実行しているものです。print ステートメントの末尾にコンマがある (および出力に改行がある) という事実は、見逃せないことです。

ls -l dummyFile \n

どのコマンドが次のように解釈されますか

{ ls -l dummyFile
; } 2>&1

line.rstrip() (または単にストリップ) を呼び出して修正します。

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

コマンド モジュールのドキュメントには、を実行するgetstatusoutput(cmd)と、

cmd実際には次のように実行されます{ cmd ; } 2>&1

これは、; } 2>&1がどこから来ているかを説明する必要があります。

私の最初の推測では、ファイルから読み取った各行の末尾から改行を削除しないことによって問題が発生しているため、実際に実行しているコマンドは次のようなものです

{ ls -l somedir
; } 2>&1

しかし、私はシェル プログラミングをよく知らないので、2 行にまたがる分割shの内容にどのように対処するの{ ... }か、また 2 行になったときに 1 行目に問題が報告される理由がわかりません。

2 番目の推測は、ファイルに空白行があることです。この場合sh、 の引数を探していて代わりlsに見つかったため、エラーが発生している可能性があり; } 2>&1ます。

3 つ目の推測は、ファイルの 1 つに}、または の;後に}.

最終的に、ファイルの内容を確認しないと、何が問題なのかはっきりとは言えませんa.txt

ちなみに、このファイルには行が含まれていないことを願ってい/ && sudo rm -rf /ます。1 つまたは 2 つの問題が発生する可能性があるためです。

于 2012-06-05T16:45:06.593 に答える