2012-06-05 3 views
3

Я Питон начинающий так, пожалуйста, помогите мне ...получение синтаксической ошибки вблизи неожиданного токена `; ' в питоне

#!/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" "[email protected]" 

Если я удалить 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 таким образом.

+1

Я только что запустил ваш код. Это нормально. – pyfunc

+0

то что не так на моем конце :( –

+0

Я запускаю эту команду - $ python demo.py –

ответ

4

Проблема вызвана этой линии:

cmd = 'ls -l ' + line 

он должен быть изменен:

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

Когда вы прочитать строку из текстового файла, вы также прочитать заднюю \n. Вам нужно strip, чтобы он работал. getstatusoutput() не нравится завершающая строка новой строки. Смотрите этот интерактивный тест (который, как я проверил это):

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

In [8]: s, o = commands.getstatusoutput('ls -l dummyFile\n') 
sh: Syntax error: ";" unexpected 
+0

i am runni ng this command - $ python demo.py –

+0

Я запускаю это в linux env моей компании, возможно ли, что они изменили ядро ​​python lib? –

+0

Да, если я удалю для цикла, тогда он отлично работает –

2

Это, кажется, проблема с командой «python», возможно, это сценарий оболочки оболочки или что-то в этом роде.

Run

$ less $(which python) 

UPDATE:

Попробуйте вызвать Питон исполняемый непосредственно, это, кажется, в /usr/bin/python2.5:

$ /usr/bin/python2.5 demo.py 
+0

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

+0

Не повезло ... побежал $/usr/bin/python2 demo.py ... тот же вывод –

+0

Содержимое 'a.txt' - в частности, _last line_ of' a.txt' - здесь. Дело в том, что использование 'ls' из скрипта является злым, вы должны использовать' os.listdir() 'Python, если вы хотите получить содержимое каталога, но ls не следует даже разбирать в сценариях оболочки, см. http://mywiki.wooledge.org/ParsingLs –

1

В documentation for the commands module говорится, что при запуске getstatusoutput(cmd),

cmd фактически работает как { cmd ; } 2>&1

Это должно объяснить откуда исходит ; } 2>&1.

Моя первая догадка о том, что проблема была вызвана не раздевая новой строки с конца каждой строки, считанной из файла, и поэтому команда, которую вы на самом деле работает что-то вроде

{ ls -l somedir 
; } 2>&1 

Тем не менее, я не очень хорошо разбираюсь в программировании оболочки, поэтому не знаю, как sh справится с содержимым раздела { ... }, разделенным на две строки, и почему он сообщает о проблеме в строке 1, когда есть две строки.

Второе предположение, что есть пустая строка в файле, в этом случае sh могут жаловаться, потому что он ищет аргумент для ls и он нашел ; } 2>&1 вместо этого.

Третье предположение состоит в том, что один из файлов содержит } или, возможно, ;, за которым следует }.

В конечном счете, я не могу точно сказать, в чем проблема, не видя содержимое вашего файла a.txt.

Кстати, я надеюсь, что этот файл не содержит строки / && sudo rm -rf /, так как это может вызвать одну или две проблемы.

1

Получил этот ответ где-то еще:

При итерацию через файл в качестве итератора, новые строки не удаляются. Ниже приведено все действия, выполняемые вашим скриптом. Тот факт, что у вас есть запятая запятая в вашем заявлении на печать (и новая строка на вашем выходе), является подделкой.

ls -l dummyFile \n 

Какие команды интерпретирует как

{ ls -l dummyFile 
; } 2>&1 

вызова line.rstrip() (или просто полоса), чтобы исправить это.

cmd = 'ls -l ' + line.strip() 
Смежные вопросы