2014-04-18 4 views
0

я должен выполнить точную команду:«sys.argv [х]» вне диапазона

python3 main.py flip pattern.ppm > flippedpattern.ppm 

на следующий код:

def main(args): 
    if sys.argv[1] == "flip": 
     fileName = sys.argv[2] 
     method = read_ppm(fileName) 
     print(method.flip()) 
     return 
if __name__ == '__main__': 
    sys.exit(main(sys.argv)) 

У меня есть файл частей на миллион, и я пытаюсь манипулировать им с помощью другого модуля, но он продолжает говорить, что sys.argv [4] выходит за допустимые пределы при присвоении ему переменной 'outputFile'

Выполненный код должен быть по существу этим для команды flip

method = "flip" 
method = read_ppm("pattern.ppm") 
f.write(method.flip()) 

Выполнение именно этого с использованием repl в visual studio приводит к успеху, но когда я пытаюсь запустить его из командной строки через главный модуль, это не сработает. Почему это? Символ «>» каким-то образом вмешивается в sys.argv, или я делаю ясную ошибку подсчета, которую я не вижу?

Заявление остальное будет приходиться на вход не выделяющийся и просто печать, используя вход

python3 main.py flip pattern.ppm 

без каких-либо файлов перенаправления.

+4

Это имеет смысл. Осмотрите содержимое 'sys.argv', если это не так - вы увидите, что в любом случае он имеет длину 3 (или 4?),' Argv [4] 'является недопустимым, поскольку 4 вне диапазона. (Обратите внимание, что '>' и after являются * не * частью аргументов командной строки.) – user2864740

+0

Как мне сохранить имя выходного файла? – somebody

+1

'method =" flip "; method = read_ppm() 'не имеет смысла. Какова цель первого задания? – 2rs2ts

ответ

3

Аргумент after> не является частью командной строки, переданной на python. Это файл, в который оболочка записывает стандартный вывод. Так, например, print "Hello" напишет Hello для flippedpattern.ppm.

Если вы хотите, чтобы flippedpattern.ppm был четвертым аргументом командной строки, просто оставьте> в вызове. (Затем стандартный вывод будет записан на экран.)

Редактировать: С учетом измененного описания вы можете написать sys.stdout.write(method.flip()). Единственная разница между этим и print(method.flip()) заключается в том, что печать добавляет символ новой строки в конце строки, а .write - нет.

+0

Итак, как я могу захватить это имя, чтобы захватить любое используемое имя файла? – somebody

+2

@somebody Вы не можете «захватить» что-либо после '>' - * перенаправление * обрабатывается оболочкой. Если вы этого хотите, не используйте перенаправление. – user2864740

+0

Чтобы уточнить, python не знает (или не заботится) о том, записывает ли он на экран или в файл при вызове print (или sys.stdout.write). Оболочка/ОС обрабатывает это. – happydave

0

Я не уверен, как работает Visual Studio, но если он работает с argv[4], это, вероятно, интерпретирует каждое слово после имени сценария, как другой аргумент (так как это не bash, чтобы иметь специальную интерпретацию для «>»).

Так что для того, чтобы работать с Баш, вероятно, вы должны изменить argv[4] в коде argv[3] и передать выходной файл в качестве еще одного аргумента вместо перенаправления:

python main.py flip pattern.ppm flippedpattern.ppm 

или оставить код, как это и добавьте «фиктивный» третий аргумент, поэтому выходной файл будет 4-м, например, заставить его обрабатывать «>» как обычный аргумент:

python3 main.py flip pattern.ppm ">" flippedpattern.ppm 
+0

Я отредактировал мой код - будет ли работать этот маршрут? Я не уверен, как решить эту проблему без изменения ввода. – somebody

+0

Я думаю, что это должно сработать. Является ли выходной файл пустым? – anana

+0

Да, он пуст - используется визуальная студия для проверки моей структуры, теперь с помощью терминала (vim) и eog для проверки вывода. – somebody

Смежные вопросы