Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Прочитать данные


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

Автор: J2A 30.8.2006, 16:30
Да.
Код

>>> 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*

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

Автор: MAKCim 30.8.2006, 16:36
Код

#!/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);

Автор: HellanD 30.8.2006, 17:28
Желательно словить не только СТДОУТ но и СТДЕРОР
(кокто использовать функу popen3)

Автор: J2A 30.8.2006, 17:59
Нужен 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. Для подробностей смотри http://docs.python.org/lib/module-subprocess.html

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

Автор: albertn 31.8.2006, 08:33
Цитата(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. 

Модуль http://docs.python.org/lib/module-popen2.html

Автор: 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.*


Автор: albertn 31.8.2006, 09:23
Цитата(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.*

Да, но каждая функция это делает по-своему

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

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

Воспользуйся os.chdir(path)

Автор: 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
Что бы это могло быть?

Автор: albertn 31.8.2006, 12:41
Цитата(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

Все работает.

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

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

А ты как на экран выводишь через print или как?

Автор: J2A 31.8.2006, 13:46
Пример в студию

Автор: HellanD 31.8.2006, 14:10
Вот например такой кусок кода смотрите:
Код

>>> 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'
>>> 

Автор: albertn 1.9.2006, 08:29
Напиши так:
Код

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

Автор: aspolyakov 11.1.2009, 14:09
Подскажите а 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"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)