2013-07-10 3 views
5

Я преподавал сам python в течение последних нескольких месяцев и, наконец, начинаю делать полезные вещи.Использование python для выдачи командной строки

То, что я пытаюсь в конечном счете сделать, это иметь скрипт python, который действует как очередь. То есть, я хотел бы иметь папку с кучей входных файлов, которую использует другая программа для выполнения вычислений (я физик-теоретик и выполняю много вычислительных заданий в день).

Способ, которым я должен сделать это сейчас, - поместить все входные файлы в поле с программным обеспечением. Затем мне нужно преобразовать входные файлы dos в unix (dos2unix), после этого я должен скопировать новый входной файл в файл с именем «INPUT». Наконец, я запускаю команду, которая запускает работу.

Все эти задачи обрабатываются в командной строке. Мой вопрос заключается в том, как связать мою программу с командной строкой? Затем, как я могу контролировать процесс (который я обычно делаю через использование процессора и команду TOP), а python запускает следующую работу, как только закончится последнее задание.

Извините за бессвязное отношение, я просто не знаю, как управлять командной строкой из сценария, а затем автоматически «наблюдать» за работой.

Благодаря

+4

Я думаю, что модуль [subprocess] (http://docs.python.org/2/library/subprocess.html) - это то, что вы хотите. Это хороший вопрос, я дам вам это, но здесь много [дубликатов] (http://stackoverflow.com/q/89228/645270) здесь, на SO. – keyser

+0

То, что вы на самом деле запрашиваете для управления командной строкой из сценария, сложно. Но когда командная строка, которую вы пытаетесь контролировать (в этом случае, оболочка) ничего не делает, вы не можете сделать более легко в Python (в данном случае с 'subprocess'), вам не нужно управляйте подсказкой. – abarnert

ответ

6

Модуль subprocess имеет много инструментов для выполнения системных команд в Python.

from subprocess import call 
call(["ls", "-l"]) 

source

вызов будет ждать команды, чтобы закончить и вернуть код возврата, так что вы можете назвать еще один потом, зная, что предыдущий закончен.

os.system это старый способ сделать это, но имеет меньше инструментов и не рекомендуется:

import os 
os.system('"C:/Temp/a b c/Notepad.exe"') 

редактировать ФВД оставил комментарий explaning как «смотреть» процесс ниже

+0

И в рамках подпроцесса вы можете использовать Popen.communicate (input = None) для «просмотра» задания, как это сделал OP. – FvD

+0

Как 'os.system' проще, чем' subprocess.call'? Это одно и то же количество понятий (и примерно столько же нажатий клавиш) в тривиальных случаях и более сложно, как только что-либо появляется (например, аргументы с пробелами в них). – abarnert

+0

Основная дежавю из дубликата, с которой я связан: p (с обсуждением 'os.system') – keyser

1

Если вам действительно нужно управлять интерактивным интерфейсом командной строки, нет никакого способа сделать это с помощью stdlib.

Для этого существует ряд сторонних опций; Я думаю, pexpect, вероятно, самый популярный.


Однако, если вы на самом деле не нужно ехать в интерактивном режиме, если программа только нуждается в вас, чтобы дать ему аргументы в командной строке, или «пакетный режим» дамп на стандартный ввод, то subprocess облегчает работу. Например, чтобы вести программу sort, вы можете просто сделать это:

with Popen(['sort', '-n'], stdin=PIPE, stdout=PIPE) as p: 
    sorted_data = p.communicate(input_data) 

Это конечно глупый пример, потому что вы можете сделать что-нибудь sort может сделать с Питона sorted с key аргумента, и, вероятно, много более читаемо.


В целом: часто, когда вы думаю вам нужно интерактивно скрипт какую-то программу, вы на самом деле нет, а иногда даже не нужно, чтобы запустить его на всех.

И ваш конкретный случай - именно такой случай. Вы спрашиваете об интерактивном написании оболочки. Но вам не нужно на самом деле этого делать, потому что Python может делать все, что вам нужно из оболочки.

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