Модераторы: 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   Вверх
albertn
Дата 31.8.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

А ты как на экран выводишь через print или как?
PM WWW ICQ   Вверх
J2A
Дата 31.8.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Пример в студию
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
HellanD
Дата 31.8.2006, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот например такой кусок кода смотрите:
Код

>>> sIn,sOut=os.popen4('openssl gendstu41452002  -out privkey.pem  dstuparam.pem -conv_form compressed')
>>> sOut.read()
'Initializing DSTU random number generator\nLoading \'screen\' into random state - done\nGenerating DSTU41452002 key, 191 bits\nengine "opensc" set.\n'
>>> 



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


Опытный
**


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

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



Напиши так:
Код

>>> sIn,sOut=os.popen4('openssl gendstu41452002  -out privkey.pem  dstuparam.pem -conv_form compressed')
>>> print sOut.read()

PM WWW ICQ   Вверх
aspolyakov
  Дата 11.1.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.9.2008
Где: Russia, Urals, Ye katerinburg

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



Подскажите а popen* может читать ваывод cmd  в реальном времени? У меня код есть и читать он вывод с задержкой и одним разом:
Код

        import os
        stdout, stdin = os.popen2('c:\import.bat',"b")
        print "Pipe opened"
        percent = 0
        s=''
        self.form.progress.setMaximum(200)
        for line in stdin.xreadlines():
            self.form.setWindowTitle("Repgen "+str(self.form.progress.value()/2)+"%")
            print line
            splitted = line.split("%")
            try:
                value = int ( splitted[0] )
                percent = percent+1
                print percent
                self.form.increase_progress_value( 1 )
            except:
                value = 0
        print "Closing pipe"

PM MAIL WWW ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




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


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

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