не делайте Вас, на самом деле хотят что-то как:
html(head(script(type='text/javascript', content='var a = ...')),
body(h1('And I like the fact that 3 < 1'), p('just some paragraph'))
я думаю, что видел что-то как этот где-нибудь. Это было бы замечательно.
РЕДАКТИРОВАНИЕ: На самом деле, я пошел и записал библиотеку сегодня, чтобы сделать просто что : magictree
можно использовать его как это:
from magictree import html, head, script, body, h1, p
root = html(
head(
script('''var a = 'I love á letters''',
type='text/javascript')),
body(
h1('And I like the fact that 3 > 1')))
# root is a plain Element object, like those created with ET.Element...
# so you can write it out using ElementTree :)
tree = ET.ElementTree(root)
tree.write('foo.xhtml')
волшебство в magictree
находится в том, как импорт работает: Эти Element
фабрики создаются при необходимости. Имейте , смотрят на источник , это на основе ответа на другой вопрос о StackOverflow .
Проще говоря: вы не можете делать именно то, что просили. Linux не поддерживает совместное использование глобальных переменных, установленных компоновщиком. Эта память будет находиться в нераспространяемом пространстве, отображаемом в подкачку.
Общий рецепт, который я могу предложить, таков:
Если вы хотите обмениваться данными только с дочерними процессами (а не с произвольными процессами, которые запускаются отдельно, которые просто связаны с одной и той же общей библиотекой), то самый простой способ сделать это - попросить библиотеку создать отображение с помощью mmap ()
в функции конструктора (которая вызывается, когда библиотека изначально загружается в родительский процесс).
Передайте MAP_ANONYMOUS
и MAP_SHARED
флаги для mmap
- это будет означать, что дочерние процессы, наследующие отображение, будут иметь отображение, которое используется совместно с родителем (и другими дочерними процессами). Затем библиотека должна хранить структуры данных, которые будут совместно использоваться в этом сегменте памяти mmap (точно так же, как если бы это была память, возвращенная из malloc
).
Как насчет создания простого канала в известном местоположении каталога, а затем заставить другие процессы открывать канал для чтения / записи a la fread / fwrite соответственно, для обмена данными ... сложная часть - обеспечить передачу данных по конвейеру таким образом, чтобы в этом случае не вызвать повреждения. Вышеупомянутое использование разделяемой памяти shm_ и mmap привязано к процессу, когда вы разветвляете код, это не проблема, поскольку код fork'd является частью исходного процесса! Надеюсь, это поможет.
С уважением, Том.