Мне нужно выполнить сценарий оболочки для запуска программы 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 и получить результат?
Пытаться:
proc.wait()
вместо вашего time.sleep(15)
.
Из документов:
Popen.wait() - Дождитесь завершения дочернего процесса. Установите и верните атрибут returncode.
Вы должны использовать метод 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')