Поскольку вы упоминаете numpy
в своих комментариях и хотите сделать это так, как они, но не до конца понимают это, я решил, что разобью это и посмотрю, сможете ли вы реализовать подобный процесс.
__ __ INIT. Ру
Ошибка, которую вы ищете, начинается с здесь , с которой вы связались в своих комментариях и ответах, так что вы уже знаете это. Он просто пытается импортировать __config__.py
и терпит неудачу, если его там нет или он не может быть импортирован.
try:
from numpy.__config__ import show as show_config
except ImportError:
msg = """Error importing numpy: you should not try to import numpy from
its source directory; please exit the numpy source tree, and relaunch
your python interpreter from there."""
raise ImportError(msg)
Так откуда же взялся файл __ config __. Py и как это помогло? Давайте следовать ниже ...
setup.py
Когда пакет установлен, setup
вызывается для запуска, и он в свою очередь выполняет действия по настройке . Это, по сути, то, что гарантирует, что пакет правильно установлен, а не запущен из каталога загрузки (что, я думаю, именно это вы и хотите гарантировать).
Ключом здесь является строка:
config.make_config_py() # installs __config__.py
misc_util.py
Это импортировано из distutils/misc_util.py
, за которым мы можем следовать вплоть до здесь .
def make_config_py(self,name='__config__'):
"""Generate package __config__.py file containing system_info
information used during building the package.
This file is installed to the
package installation directory.
"""
self.py_modules.append((self.name, name, generate_config_py))
Который затем запускает здесь , который записывает в этот файл __config__.py
некоторую системную информацию и вашу функцию show()
.
Резюме
Попытка импорта __config__.py
завершается неудачно, что порождает ошибку, которую вы хотите вызвать, если не был запущен setup.py
, что и приводит к правильному созданию этого файла. Это обеспечивает не только проверку файла, но и наличие файла только в установочном каталоге. Это все еще сопряжено с дополнительными затратами на импорт дополнительного файла при каждом импорте, но независимо от того, что вы делаете, вы добавляете некоторое количество накладных расходов, делая эту проверку в первую очередь.
Предложения
Я думаю, что вы могли бы реализовать гораздо более легкую версию того, что делает numpy
, выполняя то же самое.
Удалите подфункцию distutils
и создайте проверенный файл в вашем файле setup.py
как часть стандартной установки. Он будет существовать только в установленном каталоге после установки и никогда в другом месте, если только пользователь не подделает это (в этом случае он может обойти практически все, что вы попробуете, вероятно).
В качестве альтернативы (не зная вашего приложения и того, что делает ваш установочный файл), возможно, у вас есть функция, которая в любом случае обычно импортируется, но она не является ключевой для запуска приложения, но ее полезно иметь (в * 1069 В случае * функции представляют собой информацию об установке, такую как version()
. Вместо того, чтобы хранить эти функции там, где вы их сейчас помещаете, вы делаете их частью этого файла, который создается. Затем вы, по крайней мере, загружаете то, что иначе загружали бы в любом случае откуда-то еще.
Используя этот метод, вы импортируете что-либо независимо от того, что имеет некоторые издержки, или выдает ошибку. Я думаю, что методы, чтобы вызвать ошибку, потому что они не работают из установленного каталога, это довольно чистый и простой способ сделать это. Независимо от того, какой метод вы используете, у вас есть некоторые накладные расходы на использование этого метода, поэтому я бы сосредоточился на том, чтобы сохранить накладные расходы низкими, простыми и не вызывать ошибок.
Я бы не стал делать что-то такое сложное, как разбор файла установки или изменение необходимых файлов, например __init__.py
. Я думаю, вы правы, что эти методы будут более подвержены ошибкам.
Проверка наличия setup.py
может сработать, но я бы посчитал ее менее чистой, чем попытка import
, которая уже оптимизирована как стандартная функция Python. Они достигают схожих результатов, но я думаю, что реализованный стиль numpy
будет более простым.