Python: перезагрузите компонент Y импортированный с 'от X импорта Y'?

Вы могли найти ответ здесь - Получение международных символов от веб-страницы?

РЕДАКТИРОВАНИЕ : Это походит BeautifulSoup, не преобразовывает объекты, записанные в шестнадцатеричной форме. Это может быть зафиксировано:

import copy, re
from BeautifulSoup import BeautifulSoup

hexentityMassage = copy.copy(BeautifulSoup.MARKUP_MASSAGE)
# replace hexadecimal character reference by decimal one
hexentityMassage += [(re.compile('&#x([^;]+);'), 
                     lambda m: '&#%d;' % int(m.group(1), 16))]

def convert(html):
    return BeautifulSoup(html,
        convertEntities=BeautifulSoup.HTML_ENTITIES,
        markupMassage=hexentityMassage).contents[0].string

html = 'ǎǎ'
print repr(convert(html))
# u'\u01ce\u01ce'

РЕДАКТИРОВАНИЕ :

unescape() функция, упомянутая , @dF , который использует htmlentitydefs стандартный модуль и unichr(), мог бы быть более соответствующим в этом случае.

79
задан CharlesB 25 February 2013 в 15:21
поделиться

3 ответа

Если Y - это модуль (а X - это пакет), reload (Y) подойдет - в противном случае вы поймете, почему хорошие руководства по стилю Python (например, мой работодатель) сказал никогда не импортировать ничего кроме модуля (это одна из многих веских причин - тем не менее, люди продолжают напрямую импортировать функции и классы, как бы я ни объяснял что это не хорошая идея; -).

47
ответ дан 24 November 2019 в 10:13
поделиться

Во-первых, вам вообще не следует использовать перезагрузку, если вы можете этого избежать. Но давайте предположим, что у вас есть причины (например, отладка внутри IDLE).

Повторная загрузка библиотеки не вернет имена в пространство имен модуля. Для этого просто переназначьте переменные:

f = open('zoo.py', 'w')
f.write("snakes = ['viper','anaconda']\n")
f.close()

from zoo import snakes
print snakes

f = open('zoo.py', 'w')
f.write("snakes = ['black-adder','boa constrictor']\n")
f.close()

import zoo
reload(zoo)
snakes = zoo.snakes # the variable 'snakes' is now reloaded

print snakes

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

7
ответ дан 24 November 2019 в 10:13
поделиться

Согласно Стивенсу Расширенное программирование в среде UNIX , глава 13, это процедура для создания хорошо работающего демона Unix:

  1. Разветвляется и имеет родительский выход . Это заставляет оболочку или сценарий загрузки думать, что команда выполнена. Также гарантируется, что дочерний процесс не будет лидером группы процессов (предварительное условие для setsid next)
  2. Вызов setsid для создания нового сеанса. Это делает три вещи:
    1. Процесс становится лидером сеанса нового сеанса
    2. Процесс становится лидером группы процессов для новой группы процессов
    3. У процесса нет управляющего терминала
  3. Необязательно снова выполнить ответвление и иметь родительский выход. Это гарантирует, что демон не является лидером сеанса и не может получить управляющий терминал (в SVR4)
  4. Измените текущий рабочий каталог на / , чтобы не мешать монтированию и размонтированию
  5. Установить режим файла маска создания на 000, чтобы в дальнейшем разрешить создание файлов с любыми необходимыми разрешениями.
  6. Закройте ненужные файловые дескрипторы, унаследованные от родителя (в любом случае управляющего терминала нет): stdout , stderr , и stdin .

В настоящее время существует файл для отслеживания PID, который активно используется сценариями загрузки дистрибутива Linux.

1
ответ дан 24 November 2019 в 10:13
поделиться
Другие вопросы по тегам:

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