Как импортировать функцию из одного скрипта python без его вызова

#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 со всем кодом, который нужно было импортировать более одного раза, а затем как файл библиотеки, так и основной скрипт импортируют этот файл.