#python
#python
Вопрос:
Я пытаюсь импортировать вызываемую функцию page1
, которая содержит другие функции внутри нее, в файл библиотеки, чтобы я мог вызвать ее внутри этого файла. Однако это создает следующую ошибку:
Traceback (most recent call last):
File "/Users/antonios/numworks-math-libs/numworksMath.py", line 1, in <module>
import numworksLibs
File "/Users/antonios/numworks-math-libs/numworksLibs.py", line 1, in <module>
from numworksMath import page1
File "/Users/antonios/numworks-math-libs/numworksMath.py", line 35, in <module>
page1()
File "/Users/antonios/numworks-math-libs/numworksMath.py", line 29, in page1
numworksLibs.get_ordered_pair(ordered_pair_num, xs, ys)
AttributeError: partially initialized module 'numworksLibs' has no attribute 'get_ordered_pair' (most likely due to a circular import)
Я думаю, это связано с тем, что основной скрипт импортирует библиотеку, а библиотека импортирует основной скрипт (циклический импорт). Есть ли способ, которым я могу обойти это в Python? Я перепробовал все решения с этого веб-сайта и убедился, что ни одно из имен не противоречит каким-либо встроенным библиотекам Python, как упоминалось ранее в других сообщениях на SO. get_ordered_pair
также определяется в файле библиотеки.
импорт файла библиотеки:
from numworksMath import page1
фрагмент основного скрипта:
import numworksLibs
def page1():
page1
содержит код, который будет выполняться, если функция вызывается без ввода, и это происходит при импорте файла из командной строки Python.
Комментарии:
1. По моему опыту, импорт основного скрипта обычно пахнет кодом. Я бы переместил код,
main
который вы импортируете, в его собственный файл, а затемmain
импортировал их.2. Как выглядит ваш фактический код?
3. @JammyDodger Вам нужен весь мой код?
Ответ №1:
Вы можете защитить свой код, проверив, выполняется ли файл как скрипт или он импортируется как модуль. Для этого вам нужно проверить, установлено ли значение current __name__
'__main__'
.
Если ваш файл выглядит следующим образом:
def foo():
...
foo()
Просто измените его, чтобы он запускался только foo
__name__
тогда, когда '__main__'
def foo():
...
if __name__ == '__main__':
foo()
Теперь foo
она будет автоматически запускаться только в том случае, если вы вызываете python непосредственно для файла, а не в том случае, если он просто импортируется.
Комментарии:
1. У меня это не сработало. Это нарушило некоторые функции. То, что @Carcigenicate упомянул в моем комментарии, — это то, что сработало. Я превращаю это в ответ. Я упоминал в вопросе, что это не сработало.
2. @NotAnerd Если это у вас не работает, я настоятельно рекомендую провести рефакторинг модулей, работа которых зависит от побочных эффектов импорта. В долгосрочной перспективе это сильно повлияет на вас.
3. Да, вы правы. Сейчас я принял меры против этого.
Ответ №2:
Что вы действительно хотели бы сделать в этой ситуации, так это создать отдельный файл, подобный упомянутому @Carcigenicate. со всем кодом, который вы импортируете более одного раза, и каждый скрипт импортирует это. Для меня я создал файл, вызываемый main.py
со всем кодом, который нужно было импортировать более одного раза, а затем как файл библиотеки, так и основной скрипт импортируют этот файл.