Мне интересно, потому что у меня есть некоторые серьезные проблемы с импортом модулей пакета в мой встроенный python enterpreter, независимо от sys.path.
так например.
мой пакет
program.py
lib|
Packz|
- __init__.py
- a.py
- b.py
program.py импортирует такие функции, как
from Packz.a import afunc
from Packz.b import bfunc
Можно ли сгладить этот пакет, чтобы полностью удалить каталог, в котором находится модуль, и поместить все файлы lib в один каталог? (конечно, если имена модулей не совпадают)
program.py
lib|
Packz.py
a.py
b.py
Пока по-прежнему поддерживается возможность импорта, как это из моей основной программы:
from Packz.a import afunc
from Packz.b import bfunc
Могу ли я сделать что-то вроде:
Packz.py>
import a
import b
какие-либо мысли на эту тему?
У меня есть виртуальная файловая система, которая, похоже, испытывает проблемы с загрузкой в модуль, если на нее ссылается имя каталога. хотя основная программа «видит» файлы во всех каталогах, и я могу импортировать обычные однофайловые модули. такие как io.py timeit.py
Я пытался импортировать мой модуль с Python C API, но безрезультатно.
Я на Python 2.6, поэтому я не могу использовать Импортировать импортировать модуль с путем. (только 2.5 и ниже, похоже, это ошибка)
Спасибо!
Действительно, вы можете изменить поведение вашего пакета, отредактировав __init__.py
,
внутри __init__.py
переменная все содержит все модули, которые вы вызываете с import *
, В вашем случае это что-то вроде:
__all__ = ["afunc", "bfunc"]
from a import afunc
from b import bfunc
Увидеть следующая тема …, это может помочь;)
Мой код заработал, выполнив поиск по всем модулям в каталоге и удалив все экземпляры (используйте «sed» или возвышенный текст: D) из:
Packz.
например:
from Packz.a import afunc
becomes:
from a import afunc
andfrom Packz import a
becomes:
import a
BUT
anything that is
from Packz import __version__
stays the same
-And renaming my __init__.py file to Packz.py
(это только в том случае, если ваш файл инициализации имеет некоторую информацию о версии, если он пуст, вы можете удалить его)
теперь в вашем коде вы должны ссылаться на модуль напрямую, а не на пакет.
Если вы хотите, вы можете добавить:
__all__ = ["afunc", "bfunc"]
from a import afunc
from b import bfunc
в ваш файл Packz.py, если вам нужно импортировать все ваши модули одновременно из одного автономного модуля.
Для тех, у кого есть проблемы с функцией поиска импорта в виртуальных файловых системах, это похоже на одно достойное решение, хотя и не такое динамичное. (приступить к взлому функции импорта Python)
Это другое: (генерируйте, конвертируйте ваши пакеты модулей в c через cython, а затем вставляйте модули в бинарный файл вашего приложения, тогда вам не нужно беспокоиться о проблемах с маршрутизацией … + это заставляет код работать быстрее)
http://mdqinc.com/blog/2011/08/statically-linking-python-with-cython-generated-modules-and-packages/
в C ++ добавить
setenv («PYTHONPATH», «.», 0);