Как возобновить программу (или выход) после открытия webbrowser?

Готовые к использованию функции для проверки

function isObject(o) {
  return null != o && 
    typeof o === 'object' && 
    Object.prototype.toString.call(o) === '[object Object]';
}

function isDerivedObject(o) {
  return !isObject(o) && 
    null != o && 
    (typeof o === 'object' || typeof o === 'function') &&
    /^\[object /.test(Object.prototype.toString.call(o));
}

// Loose equality operator (==) is intentionally used to check
// for undefined too

// Also note that, even null is an object, within isDerivedObject
// function we skip that and always return false for null

Объяснение

  • В Javascript, null, Object, Array, Date и function - все объекты. Хотя null немного надумано. Итак, лучше сначала проверить null, чтобы обнаружить, что оно не равно нулю.

  • Проверка на typeof o === 'object' гарантирует, что o является объектом. Без этой проверки Object.prototype.toString был бы бессмысленным, поскольку он возвращал бы объект навсегда, даже для undefined и null! Например: toString(undefined) возвращает [object Undefined]!

    После проверки typeof o === 'object' toString.call (o) является отличным методом для проверки того, является ли o объектом, производным объектом, подобным Array , Date или function.

  • В функции isDerivedObject проверяется, является ли o функцией. Потому что функционируют также как объект, поэтому он здесь. Если этого не произошло, функция вернется как false. Пример: isDerivedObject(function() {}) вернет false, однако теперь возвращает true.

  • Всегда можно изменить определение того, что является объектом. Таким образом, можно изменить эти функции соответственно.


Тесты

function isObject(o) {
  return null != o && 
    typeof o === 'object' && 
    Object.prototype.toString.call(o) === '[object Object]';
}

function isDerivedObject(o) {
  return !isObject(o) && 
    null != o && 
    (typeof o === 'object' || typeof o === 'function') &&
    /^\[object /.test(Object.prototype.toString.call(o));
}

// TESTS

// is null an object?

console.log(
  'is null an object?', isObject(null)
);

console.log(
  'is null a derived object?', isDerivedObject(null)
);

// is 1234 an object?

console.log(
  'is 1234 an object?', isObject(1234)
);

console.log(
  'is 1234 a derived object?', isDerivedObject(1234)
);

// is new Number(1234) an object?

console.log(
  'is new Number(1234) an object?', isObject(new Number(1234))
);

console.log(
  'is new Number(1234) a derived object?', isDerivedObject(1234)
);

// is function object an object?

console.log(
  'is (new (function (){})) an object?', 
  isObject((new (function (){})))
);

console.log(
  'is (new (function (){})) a derived object?', 
  isObject((new (function (){})))
);

// is {} an object?

console.log(
  'is {} an object?', isObject({})
);

console.log(
  'is {} a derived object?', isDerivedObject({})
);

// is Array an object?

console.log(
  'is Array an object?',
  isObject([])
)

console.log(
  'is Array a derived object?',
  isDerivedObject([])
)

// is Date an object?

console.log(
  'is Date an object?', isObject(new Date())
);

console.log(
  'is Date a derived object?', isDerivedObject(new Date())
);

// is function an object?

console.log(
  'is function an object?', isObject(function(){})
);

console.log(
  'is function a derived object?', isDerivedObject(function(){})
);
5
задан conorsch 19 July 2009 в 05:22
поделиться

3 ответа

Здесь проще всего выполнить форк. Я почти уверен, что это не работает в 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()
4
ответ дан 13 December 2019 в 22:13
поделиться

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

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

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

>>> import webbrowser
>>> import threading
>>> x=lambda: webbrowser.open_new('http://scompt.com')
>>> t=threading.Thread(target=x)
>>> t.start()
6
ответ дан 13 December 2019 в 22:13
поделиться

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

0
ответ дан 13 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: