Запустить сценарий оболочки в Python

1

Мне нужно выполнить сценарий оболочки для запуска программы 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 для выполнения этой команды, а также ждать, пока он вернет результат. Это необходимо.

Я использовал subprocess.Popen, он не возвращает результат, как то, что я получил от 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 и получить результат?

  • 1
    Запуск Python изнутри Python? Тьфу. Есть ли причина, по которой вы не можете импортировать этот скрипт и использовать его как модуль?
  • 0
    Да, конечно. Причина в "xvfb-run". Он выполняет только мой модуль python. Xvfb - это x виртуальный фрейм буфера. Вместе с xvfb только этот модуль даст результат.
Показать ещё 3 комментария
Теги:
subprocess
ubuntu-11.04

2 ответа

7
Лучший ответ

Пытаться:

proc.wait()

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

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

Popen.wait() - Дождитесь завершения дочернего процесса. Установите и верните атрибут returncode.

2

Вы должны использовать метод 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 ('[email protected]')
   child.expect ('ftp> ')
   child.sendline ('cd pub')
   child.expect('ftp> ')
   child.sendline ('get ls-lR.gz')
   child.expect('ftp> ')
   child.sendline ('bye')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню