Как возобновить работу программы (или выйти) после открытия веб-браузера? - PullRequest
5 голосов
/ 19 июля 2009

Я делаю небольшую программу на Python, которая вызывает модуль webbrowser, чтобы открыть URL. Открытие URL работает замечательно.

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

if viewinbrowser == "y":
    print "I can definitely do that. Loading URL now!"
    webbrowser.open_new(url)
    print "Exiting..."
    sys.exit()

Программа не достигает уровня выполнения print "Exiting...", который я добавил, потому что заметил, что программа по какой-то причине не покидала оператор if.

Я запускаю эту программу из командной строки, если это важно. Редактировать: Я работаю на Kubuntu 9.04 i386, используя KDE 4.3 через backports. Я использую Firefox 3.5 в качестве браузера по умолчанию, объявленного в Системных настройках для KDE, и он корректно вызывается программой. (По крайней мере, в Firefox открывается новая вкладка с нужным URL-адресом - я считаю, что это требуемая функциональность.) / Edit

Кроме того, я предполагаю, что эта проблема возникнет практически при любом внешнем вызове, но я очень плохо знаком с Python и не знаю терминологию для поиска на этом сайте. (Поиск «python webbrowser» ничего полезного не дал.) Итак, я прошу прощения, если это уже обсуждалось под другим заголовком!

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 19 июля 2009

Похоже, это зависит от того, на какой платформе вы работаете.

  • MacOSX - немедленно возвращает True и открывает окно браузера. Предположительно ваше желаемое поведение.
  • Linux (без X) - открывает ссылки в текстовом режиме браузера. Как только это закрыто, возвращает True.
  • Linux (с X) - открывает Konquerer (в моем случае). Возвращает True немедленно. Ваше желаемое поведение.

Я предполагаю, что вы работаете в Windows, которая, как упоминал другой комментатор, не имеет форка. Я также предполагаю, что модуль веб-браузера использует fork для внутреннего использования, поэтому он не работает для вас в Windows. Если это так, то использование модуля потоков для создания нового потока, открывающего веб-браузер, может быть самым простым решением:

>>> import webbrowser
>>> import threading
>>> x=lambda: webbrowser.open_new('http://scompt.com')
>>> t=threading.Thread(target=x)
>>> t.start()
4 голосов
/ 19 июля 2009

Самое простое, что здесь можно сделать, это, вероятно, раскошелиться. Я почти уверен, что это не работает в Windows, к сожалению, так как я думаю, что их модель процесса может отличаться от Unix-подобных операционных систем. Однако процесс будет похожим.

pid = os.fork()
if pid:
    # we are the parent, continue on
    print "This runs in a separate process from the else clause."

else:
    #child runs browser then quits.
    webbrowser.open_new(url)
    print "Exiting..."
    sys.exit()
0 голосов
/ 19 июля 2009

Модуль веб-браузера выполняет системный вызов для запуска отдельной программы (веб-браузера), затем ожидает («блокирует») код выхода. Это происходит каждый раз, когда вы запускаете программу из другой программы. Вы должны (A) написать свою собственную функцию, которая не блокирует ожидание выхода веб-браузера (с помощью потоков, fork () или подобного), или выяснить, есть ли у модуля веб-браузера неблокирующий вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...