LINUX.ORG.RU

Python и консольные команды

 ,


0

1

Подскажите как в питоне отдать консольную команду? Читал это http://habrahabr.ru/post/47474/ но это лишь определенные, а как любую консольную команду отдать, скажем ls, или apt-get install?

Допустим есть условие:

def on_clicked(self, widget):
if widget.get_active():
#Тут нужно отдать команду gnome-system-monitor



Последнее исправление: lorovec (всего исправлений: 1)

import subprocess #импортируем модуль subprocess
def basic_download(key,url):  # определяем функцию с двумя параметрами(первый содержит #ключи,а второй адрес)   
 if url=='':  #если адрес пуст вернем ошибку                   
     return -1
 if key=='':  # если параметр key не задан, вызываем wget с параметрами по умолчанию... 
    retcode=subprocess.call(["wget",url])
    return retcode
 else: #иначе
    key='-P'+key #конкатенация ключа и пути сохранения  
    retcode=subprocess.call(["wget",key,url])
    return retcode     
pylin ★★★★★
()
Ответ на: комментарий от pylin

return -1

эксепшены же, ну! Тем более мешать ошибки внутри функции с кодами возврата внешних програм это не комильфо. Как понять кто вернул -1: функция из-за того что аргументы кривые или wget? (да, я знаю что коды возврата положительные)

Это помимо того что url==" это хреновая проверка. В url может быть всё что угодно, кто сказал что это строка? Во-вторых, если строка пустая то wget сам вернёт ошибку, в чём смысл проверять дважды?

true_admin ★★★★★
()
Ответ на: комментарий от pylin

ну и вообще если сделать def download(url, key='./') то не надо будет писать лишний if и проверять задан ли key.

true_admin ★★★★★
()
Ответ на: комментарий от pylin

и вообще лучше сразу check_call чтобы эксепшн выплёвывало. Оно ведь либо скачалось, либо нет, статус возврата это просто индикатор ошибки, а не полезная инфа (впрочем, это можно выцепить из эксепшена если сильно нужно). А ошибки лучше передавать эксепшенами.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Лучше не дёргать вгет вообще, а воспользоваться urllib2.

aedeph_ ★★
()
Ответ на: комментарий от hippi90

Deprecated же, не?

http://docs.python.org/library/os.html#os.system

The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function.

Не написано, что она deprecated, а для обычного запуска команды достаточно os.system() — возможности subprocess тут излишни.

gentoo_root ★★★★★
()
Ответ на: комментарий от true_admin

Согласен, старый код валялся вот и выкинул в тему, а так да совсем не камильфо, за то теперь ТС увидел как писать не надо:)

pylin ★★★★★
()
Ответ на: комментарий от shylent

Не разобрались в subprocess?

А что там разбираться? В документации всё разжёвано настолько, что не разобраться трудно. С данной задачей справляется и os.system(), тем более что модуль os будет с большой вероятностью подключён. Но у subprocess.call(), конечно, есть неоспоримое преимущество — он умеет запускать процессы напрямую, без запуска /bin/sh, что будет работать быстрее.

gentoo_root ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.