Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прочитать данные 
:(
    Опции темы
HellanD
Дата 30.8.2006, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Задача такая из командной строки можно вызвать файл задав ему некоторые параметры
В результате файл выведет данные в зависимости от параметров.
Вопрос:
Необходимо запустить файл из ПИТОНА (+ задать небходимые параметры) а результат записать в отдельную переменную!
Можно ли для этого использовать пайпы?  


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
J2A
Дата 30.8.2006, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Да.
Код

>>> import os
>>> p = os.popen('uname -a')
>>> p.read()
'Linux moby 2.6.15.1 #1 Tue Jan 24 22:45:00 OMST 2006 i686 GNU/Linux\n'


Если нужно разделить stdout/stderr, то для этого есть варианты popen*
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
HellanD
Дата 30.8.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Или если немного уточнить требуется сделать запуск программы из питона с задачей параметров
(Ну по сути такое можно зделать руками из командной строки)



--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
MAKCim
Дата 30.8.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



Код

#!/usr/bin/python

import sys;
import os;

def main(argc,argv):
    if argc<2: sys.exit(1);
    name=sys.argv[1];
    sys.argv[0:2]=[];
    fds=os.pipe();
    pid=os.fork();
    if pid>0:
        os.close(fds[1])
        os.wait();
        str=os.read(fds[0],4);
        os.close(fds[0]);
    elif pid<0: sys.exit(2);
    os.close(fds[0]);
    os.dup2(fds[1],1);
    os.execvp(name,sys.argv);

main(len(sys.argv),sys.argv);



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
HellanD
Дата 30.8.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Желательно словить не только СТДОУТ но и СТДЕРОР
(кокто использовать функу popen3)


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
J2A
Дата 30.8.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Нужен Py2.4+
Код

>>> import subprocess
>>> p = subprocess.Popen(["uname", "-a"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> p.stdout.read()
'Linux moby 2.6.15.1 #1 Tue Jan 24 22:45:00 OMST 2006 i686 GNU/Linux\n'
>>> p.stderr.read()
''


P.S. Для подробностей смотри документацию
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
slav0nic
Дата 31.8.2006, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.5.2006

Репутация: 4
Всего: 5



os.popen2/3 возвращает какраз  значения stdout, stderror можно ловить без гиммороя
--------------------
                                 python.com.ua 
PM MAIL WWW Jabber   Вверх
albertn
Дата 31.8.2006, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(slav0nic @ 31.8.2006,  01:15)
os.popen2/3 возвращает какраз  значения stdout, stderror можно ловить без гиммороя

А что еще для  счастья надо?
Код

popen2(    cmd[, bufsize[, mode]])
    Executes cmd as a sub-process. Returns the file objects (child_stdout, child_stdin). 

popen3(    cmd[, bufsize[, mode]])
    Executes cmd as a sub-process. Returns the file objects (child_stdout, child_stdin, child_stderr). 

popen4(    cmd[, bufsize[, mode]])
    Executes cmd as a sub-process. Returns the file objects (child_stdout_and_stderr, child_stdin). New in version 2.0. 

Модуль popen2
PM WWW ICQ   Вверх
J2A
Дата 31.8.2006, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



slav0nicalbertn:

Цитата

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, such as:

os.system
os.spawn*
os.popen*
popen2.*
commands.*


--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
albertn
Дата 31.8.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(J2A @ 31.8.2006,  09:21)
slav0nicalbertn:

Цитата

The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, such as:

os.system
os.spawn*
os.popen*
popen2.*
commands.*

Да, но каждая функция это делает по-своему
PM WWW ICQ   Вверх
HellanD
Дата 31.8.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Еще не большой ньюанс:
В во время выполнения функи popen3 создаеться файлик (так и задумано) и кидаеться в корневую папочку (ну от куда вызывался) а у меня это получаеться рабочий стол....
Подскажите как поменять это на произвольную папку...
Спасибо!


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
albertn
Дата 31.8.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(HellanD @ 31.8.2006,  11:34)
Еще не большой ньюанс:
В во время выполнения функи popen3 создаеться файлик (так и задумано) и кидаеться в корневую папочку (ну от куда вызывался) а у меня это получаеться рабочий стол....
Подскажите как поменять это на произвольную папку...
Спасибо!

Воспользуйся os.chdir(path)
PM WWW ICQ   Вверх
HellanD
Дата 31.8.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Вообще я странную вещь заметил...
Смотрите вот со страницы: 
http://docs.python.org/lib/module-popen2.html 
говорят:

popen4( cmd[, bufsize[, mode]]) 

Executes cmd as a sub-process. Returns the file objects (child_stdout_and_stderr, child_stdin). 

В тоже время у меня она возврщает данные в такой последовательности:
1.child_stdin
2.child_stdout_and_stderr
Что бы это могло быть?


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
albertn
Дата 31.8.2006, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 368
Регистрация: 17.7.2006
Где: г. Ставрополь

Репутация: 30
Всего: 34



Цитата(HellanD @ 31.8.2006,  12:11)
Вообще я странную вещь заметил...
Смотрите вот со страницы: 
http://docs.python.org/lib/module-popen2.html 
говорят:

popen4( cmd[, bufsize[, mode]]) 

Executes cmd as a sub-process. Returns the file objects (child_stdout_and_stderr, child_stdin). 

В тоже время у меня она возврщает данные в такой последовательности:
1.child_stdin
2.child_stdout_and_stderr
Что бы это могло быть?

У меня все впорядке, никогда таких проблем небыло
Код

import popen2
(a,b) = popen2.popen4('ls')
b.close()
s = a.read()
a.close()
print s

Все работает.
PM WWW ICQ   Вверх
HellanD
Дата 31.8.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Еще ньюанс один:
Если я просматриваю СТДОУТ (напр команда sOut.read()) то сообщения теряют стандартное форматирование (ну если из командной строки все сделать то данные выведутся в красивые таблички а у меня вместо сего выводит все подряд включая символы форматирования) Вопрос можно ли както сберечь форму СТДАУТА(НУ И ЕРОРА)
Спасибо



--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0768 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.