2013-07-16 15 views
0

Я пытаюсь написать сценарий, который использует sys.argv, чтобы обернуть команду scp. Идея, что вы будете иметь возможность запускать: pyscp folder/* host, но если я запускаю этот скрипт с этими аргументами:Звезда в sys.argv в python

import sys 

for arg in sys.argv: 
    print arg 

получить список всех папок внутри folder:

pyscp.py 
folder/0 
folder/1 
folder/2 
folder/3 
folder/4 
folder/5 
folder/67 
folder/8 
folder/9 
host 
+3

Какое поведение ожидается? –

ответ

6

Предполагая Операционная система UNIXoid: оболочка расширяет * в соответствующие файлы. Попробуйте назвать свой сценарий как

pyscp "folder/*" host 

Кавычки сохранить оболочку от интерпретации * характера.

+0

Хм спасибо! Не идеальное решение, но оно работает :-) – andy

+0

@andy - пусть оболочка сделает расширение. вы можете сказать 'files = sys.argv [1: -1]' и 'host = sys.argv [-1]', и ваша программа будет работать с оболочкой, как все ожидают. хм ... возможно, это должен быть ответ. – tdelaney

2

Если вы не избежите звездочки, оболочка выполняет расширение имени файла для вас. Шаблон, включающий звездочку, заменяется алфавитно отсортированным списком имен файлов, соответствующих шаблону, до того, как ваша программа Python будет выполнена. Вы можете запретить оболочке выполнять расширение имени файла, например, одиночные кавычки, т.е.

pyscp 'folder/*' hostname 

Вы можете сделать это самостоятельно в Python с использованием модуля glob и управления вещи так, как вы хотите.

+0

'*' - это звездочка, '&' - амперсанд. – thegrinner

+0

Оба начинаются с а, и я часто смешиваю их. :-) –

+1

@ Jan-PhilipGehrcke '*' это звезда, такая как астра ... oids. И '&' является амперсандом. – glglgl

-2

Слой расширяет список файлов для вас. Вы можете использовать это, разрешив несколько параметров в команде.

import sys 
files = sys.argv[1:-1] 
host = sys.argv[-1] 

Теперь у вас есть более гибкая программа, которая позволяет прыгать абоненте через любые обручи он хочет для передачи, как, может быть, все текстовые файлы в folder1 плюс все, что изменилось в последний день в folder2 (на Linux машине) :

pyscp folder1/*.txt `find -mtime -1` example.com 
+0

Использование 'find' в подобных обратных тактиках - это очень неправильный подход - он разделяет строки и glob-расширяет результаты поиска, поэтому имена файлов с пробелами, пробелами или выражениями glob в их именах могут выходить совершенно неправильно. Более безопасный подход будет таким: a =(); в то время как IFS = '' read -r -d ''; do a + = («REPLY»); done <<(find -mtime -1 -print0); pyscp folder1/*. txt "$ {a [@]}" example.com' –

+0

@Charles Duffy. Без разницы. Дело в том, что вы можете использовать свою оболочку для выбора файлов, а пример поиска работает очень хорошо, если вы знаете, что имена ваших файлов не имеют пробелов или метасимволов оболочки. – tdelaney

+0

Когда вы _know_, с каким файлом ваш скрипт будет запущен или против? Написание кода, который ломается, когда выполняются произвольные условия, - это не что иное, как опрометчивость; предоставляя его как пример другим, аналогичным образом. См. Также запись № 1 в http://mywiki.wooledge.org/BashPitfalls –

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