Можно ли полностью сгладить пакет Python, полностью удалив каталог?

Мне интересно, потому что у меня есть некоторые серьезные проблемы с импортом модулей пакета в мой встроенный 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 и ниже, похоже, это ошибка)

Спасибо!

0

Решение

Действительно, вы можете изменить поведение вашего пакета, отредактировав __init__.py,

внутри __init__.pyпеременная все содержит все модули, которые вы вызываете с import *, В вашем случае это что-то вроде:

__all__ = ["afunc", "bfunc"]
from a import afunc
from b import bfunc

Увидеть следующая тема …, это может помочь;)

0

Другие решения

Мой код заработал, выполнив поиск по всем модулям в каталоге и удалив все экземпляры (используйте «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/

0

в C ++ добавить

setenv («PYTHONPATH», «.», 0);

0
По вопросам рекламы [email protected]