2013-07-16 3 views
-1

Нужна помощь, так что я пытаюсь сделать, это: -Откройте командную строку в фоновом режиме

Я хочу настроить программу питона, которая откроет командную строку в фоновом режиме, и я буду в состоянии давать команды, как вход в программу python, он затем переадресует эти команды в командную строку и выдаст мне вывод, я хочу, чтобы это соединение было установлено на время, которое я хочу,

Я прошел через некоторые коды python, что происходит в них, когда я вхожу в команду, он выводит мне результаты сразу, а затем выходит, я не хочу, чтобы этот экземпляр командной строки завершил работу до тех пор, пока я не захочу, поэтому я могу вносить изменения, менять каталоги и т. д.

Я пробовал, но никакого такого результата :(.

Так что, если какие-либо идеи мне помогают.

Thnx люди.

+5

Не просто сказать «я попробовал», расскажите нам, что вы пробовали, и каков результат.Между тем: способ открыть командную строку или любую другую программу - это модуль подпроцесса. Если вы хотите управлять вводом и выводом вместо того, чтобы просто подключаться к вашим собственным входам и выходам, ключ является 'subprocess.PIPE'. Способ сделать что-то в фоновом режиме - это модуль 'threading'. Это должно быть все, что вам нужно здесь. Просто покажи нам, где ты застрял. – abarnert

+0

ohk sure dude, well basic logic is, Я хочу создать программу python, после чего свяжутся или свяжутся с командной строкой, поэтому я могу дать ей команды, подпроцесс работает, но командное приглашение выходит после ввода одной команды или так , я хочу, чтобы тот же самый экземпляр работал на время, которое я хочу. я планирую что-то вроде следующих подпроцесса команды импорта подсказок начинают в то время как 1: а = вводить команды process.stdin.write (а + "\ п") общаться() если == '': выйдите из командной строки Спасибо – user2585427

+1

Да, «общаться» просто отправляет один кусок ввода и возвращает один выход из одного выноска. Вам действительно нужно использовать чтение и запись 'PIPE' самостоятельно. – abarnert

ответ

0

Хорошо, теперь я помню. Способ держать подпроцесс оболочки открытым, чтобы держать stdin PIPE открытым

from subprocess import Popen, PIPE 

process = Popen(['whatever'], stdin=PIPE, stdout=PIPE,shell=True) 
process.stdin.write('Hello\n') 
print repr(process.stdout.readline()) 
process.stdin.write('World\n') 
print repr(process.stdout.readline()) 

#close 
process.stdin.close() 
process.wait() 

Но это не рекомендуется, и это ненадежно. Используйте pexpect (не для Windows) и для использования в окнах winpexpect.

В ссылке на эту тему, Keeping a pipe to a process open

Взгляните на этот вопрос, а также, Using module 'subprocess' with timeout

Также обратите внимание на этот код от ActiveState, http://code.activestate.com/recipes/576911-keep-a-process-up-and-running/

+0

Это работает только в том случае, если вам нужна только одна строка ответа (или, наоборот, точно знать, сколько строк вам потребуется) из 'process.stdout'. В противном случае вам нужно просто продолжать «читать» до тех пор, пока вы не заблокируете ... в этот момент вы заблокированы, и вся ваша программа застряла. Вы не можете обойти это с помощью 'select' в переносном режиме, поэтому единственной реальной опцией является потоки. Вот почему, в Python 3.2+, 'communication' использует потоки. – abarnert

+0

Thnx приятель для вашей помощи – user2585427

+0

В частности, если '' any'' '' sh'' или '' cmd'', и что вы пишете для него, это произвольные команды, вы не можете точно знать, сколько читать в ответ. – abarnert

1

Если вы хотите, чтобы это сделать с subprocess, вот что вы делаете:

p = subprocess.Popen(['sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

Теперь, когда-либо y раз, когда вы хотите отправить команду, вы должны выполнить команду p.stdin.write(). И вы должны получить результат p.stdout.read().

Но это блокировка вызовов. Итак, что вы, вероятно, хотите есть:

  • Читатель нитью петли на p.stdout.read() и сообщений к queue.Queue
  • писатель нить, что петли на другой queue.Queue и делает p.stdin.write().
  • Основная тема, которая касается ввода и вывода пользователя через очереди.
  • Возможно, четвертая нить до wait на объекте Popen.

Это нелегко, но source code to communicate покажет вам, как это сделать. (Не забудьте прочитать версию 3.2 или более поздней версии, потому что предыдущие версии на самом деле не сделали это правильно.)

Если вам нужно что-то более простое, используйте библиотеку более высокого уровня, такую ​​как или любую из дюжины оболочек оболочки на PyPI.

+0

Thnx чувак, полезно, я тоже проверю pexpect. – user2585427