2012-08-07 3 views
5

Каким будет процесс написания скриптов Python с помощью «xargs»? Например, я хотел бы следующую команду, чтобы работать через каждую строку текстового файла и выполнить произвольную команду:Создание скриптов Python с xargs

cat servers.txt | ./hardware.py -m 

По существу хотел бы каждая строка будет передан hardware.py сценария.

+2

Что вы показываете, есть * стандартный ввод *, но то, что вы * задаете *, является 'xargs'. Это не одно и то же. Кого вы хотели? – kojiro

+0

Есть ли какая-то особая причина, которую вы не можете просто прочитать в текстовом файле в python? – ciferkey

+0

Труба просто соединяет 'cat'' stdout' с hardware.py 'stdin'. Итак, в hardware.py вы должны просто прочитать данные из 'stdin' (например, data = raw_input()). –

ответ

6

Чтобы ваши команды работали с xargs, вам просто нужны они для принятия аргументов. Аргументы в Python находятся в списке sys.argv. Таким образом, вы можете выполнить Somthing как:

find . -type f -name '*.txt' -print0 | xargs -0 ./myscript.py 

, который может быть эквивалентно

./myscript.py ./foo.txt ./biz/foobar.txt ./baz/yougettheidea.txt 

Для того, чтобы ваши команды работают со стандартным входом, вы также можете использовать модуль sys, на этот раз с sys.stdin, которую вы можете рассматривать как файл. Это больше похоже на пример, который вы указали:

./myscript.py < somefile.txt 
1

Вы путаете два вопроса.

Во-первых, ваше приложение может получать ввод от stdin. Это не имеет никакого отношения к xargs. В вашем примере, все hardware.py нужно сделать, это прочитать sys.stdin в качестве входного файла, например:

if __name__=='__main__': 
    for line in sys.stdin: 
     do_something(line) 

Если вы хотите hardware.py производить вывод, что другие программы вниз линии можно использовать, просто напишите sys.stdout

Во-вторых, ваше приложение может получать входные данные из аргументов. Здесь вы должны использовать xargs. Например:

xargs ./hardware.py < servers.txt # такой же, как cat servers.txt | xargs ./hardware.py

Это будет передавать каждое «слово» server.txt (не каждая строка ) как аргумент hardware.py (возможно, сразу несколько аргументов). Это будет то же самое, что работает hardware.py word1 word2 word3 word4 ...

Python хранит аргументы командной строки в массиве sys.arvg. sys.argv[0] будет именем команды, а sys.argv[1:] - все аргументы командной строки. Тем не менее, вы обычно лучше обрабатываете свою командную строку, используя argparse.

0

Не совсем понятно, что вы хотите сделать.Если ./hardware.py -m читает одну строку из стандартного ввода, вы можете использовать GNU Parallel распространять эти строки:

cat servers.txt | parallel --pipe -N1 ./hardware.py -m 

Если ./hardware.py -m принимает один сервер в качестве аргумента вы можете сделать:

cat servers.txt | parallel ./hardware.py -m 

Вы можете установить GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

Смотреть интро видео для GNU Parallel, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1