Запустить сценарий оболочки в Python - PullRequest
1 голос
/ 22 декабря 2011

Мне нужно выполнить скрипт оболочки, чтобы запустить программу python через команду python.

Я должен выполнить свой скрипт на Python, как это

ubuntu@ip-10-32-157-231:~/hg_intcen/lib$ xvfb-run python webpage_scrapper.py  http://www.google.ca/search?q=navaspot

Этот сценарий необходимо выполнить в программе на Python, поскольку на этот модуль необходимо передать огромные ссылки.

Я искал, чтобы выполнить этот сценарий оболочки на python, поэтому я использовал «подпроцесс»

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

Я использовал подпроцесс. При открытии он не возвращает результат, подобный тому, что я получил от bash

import subprocess
def execute_scrapping(url):
   exe_cmd = "xvfb-run python lib/webpage_scrapper.py"+" "+str(url)
   print "cmd:"+exe_cmd
   proc = subprocess.Popen(exe_cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
   time.sleep(15)
   sys.stdout.flush()
   d=proc.stdout.readlines()
   return d[1]

это выше не приводит к точному результату. Не могли бы вы предложить мне выполнить команду bash shell через python и получить результат?

Ответы [ 2 ]

7 голосов
/ 22 декабря 2011

Попробуйте:

proc.wait()

вместо вашего time.sleep(15) вызова.

Из документов:

Popen.wait () - Ожидание ребенкапроцесс прекратить.Установить и вернуть атрибут кода возврата.

2 голосов
/ 22 декабря 2011

Вы должны использовать метод communication () , чтобы дождаться завершения внешнего процесса.

stddata, stderr = proc.communicate()

Если вам нужно обмениваться сообщениями между двумя процессами, посмотрите в модуль pexpect :

с сайта:

   import pexpect
   child = pexpect.spawn ('ftp ftp.openbsd.org')
   child.expect ('Name .*: ')
   child.sendline ('anonymous')
   child.expect ('Password:')
   child.sendline ('noah@example.com')
   child.expect ('ftp> ')
   child.sendline ('cd pub')
   child.expect('ftp> ')
   child.sendline ('get ls-lR.gz')
   child.expect('ftp> ')
   child.sendline ('bye')
...