Обзор
Я запускаю некоторые научные симуляции и хочу обработать полученные данные в Python. Моделирование создает пользовательский тип данных, который не используется за пределами цепочки программ, созданных авторами моделирования, поэтому, к сожалению, мне нужно то, что они мне предоставляют.
Они хотят, чтобы я установил два файла:
- Модуль с именем
sdds.py
, который определяет класс, предоставляющий все пользовательские функции и две демонстрации. - Скомпилированный модуль с именем
sddsdatamodule.so
, который предоставляет только вспомогательные функции дляsdds.py
.
(Мне кажется странным, что они предлагают мне два модуля, которые настолько неразрывно связаны, что мне это не кажется хорошей практикой кодирования, но использование их кода, вероятно, лучше, чем переписывать все с нуля.) Я бы предпочел не делать этого. чтобы установить их прямо на моем пути, бок о бок. Они созданы одной компанией и предназначены для совместного выполнения одной конкретной задачи: доступа к файлам типа SDDS и манипулирования ими.
Вот я и подумал, что положу их в пакет. Я мог бы установить его на моем пути, он был бы автономным, и я мог бы легко найти и удалить или обновить модули из одного места. Тогда я мог бы спрятать их не-Pythonic-решение в более-Pythonic-пакете без существенного переписывания вещей. Кажется элегантным.
Подробности
Пакет, который я на самом деле использую, находится здесь:
К сожалению, сейчас они поддерживают только Windows и Mac OS X. Компиляция исходного кода довольно обременительна, и, по-видимому, у них нет существенных запросов для Linux/Unix. У меня Mac, так что, к счастью, для меня это не проблема.
Итак, мое дерево каталогов выглядит так:
SDDSPython/ My toplevel package
__init__.py Designed to only import the SDDS class
sdds.py Defines SDDS class and two demo methods
sddsdatamodule.so Defines sddsdata module used by SDDS class.
Мой файл __init__.py
буквально содержит только это:
from sdds import SDDS
Файл sdds.py
содержит определение класса и два демонстрационных определения. Единственный другой код в файле sdds.py
:
import sddsdata, sys, time
class SDDS:
(lots of code here)
def demo(output):
(lots of code here)
def demo2(output):
(lots of code here)
Затем я могу импортировать SDDSPython
и проверить, используя dir
:
>>> import SDDSPython
>>> dir(SDDSPython)
['SDDS', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'sdds', 'sddsdata']
Итак, теперь я могу получить доступ к классу SDDS
через SDDSPython.SDDS
Вопрос
Как, черт возьми, SDDSPython.sdds
и SDDSPython.sddsdata
загрузились в пространство имен SDDSPython
??
>>> SDDSPython.sdds
<module 'SDDSPython.sdds' from 'SDDSPython/sdds.pyc'>
>>> SDDSPython.sddsdata
<module 'SDDSPython.sddsdata' from 'SDDSPython/sddsdatamodule.so'>
Я думал, что, создавая файл __init__.py
, я специально исключал модули sdds
и sddsdata
из загрузки в пространство имен SDDSPython
. Что здесь происходит? Я могу только предположить, что это происходит из-за чего-то в файле sddsdatamodule.so
? Но как модуль может так влиять на пространство имен своего родителя? Я довольно потерян, и я не знаю, с чего начать. Я просмотрел код C, но не вижу ничего подозрительного. Честно говоря, я, вероятно, не знаю, как может выглядеть что-то подозрительное, я, вероятно, недостаточно знаком с программированием расширений C для Python.