Вызов функции Python из другого файла

Эта проблема смущала меня в течение нескольких дней.

У меня есть два файла, helpers.py и launcher.py.

В helpers.py я определил функцию hello(), которая печатает "привет".

Я хочу позвонить hello() в launcher.py.

Вот что я написал в launcher.py:

from helpers import hello
....
helpers.hello()

Но когда я запускаю его, я получаю следующее:

    from helpers import hello
ImportError: No module named helpers

Как это исправить?

Изменить в ответ на ответы/комментарии

  1. Я использую OS X и Python 3.4.
  2. Два файла находятся в одном каталоге
  3. Я пробовал два способа:

    from helpers import hello
    hello()
    

    а также

    import helpers
    helpers.hello()
    

    Но все равно этот баг:

    import helpers
    ImportError: No module named 'helpers'
    

Я думаю, что в CLASSPATH терминала должно быть что-то не так.

Второе редактирование

Проблема, выделенная в этих ответах была проблема, но в конце концов сброс пути к классам разрешился.


person Jack Zhao    schedule 17.08.2015    source источник
comment
Не могли бы вы предоставить информацию о вашей операционной системе и структуре файловой системы, в которой вы работаете?   -  person Juergen    schedule 17.08.2015
comment
Отсутствие модуля с именем helpers означает, что он не смог найти программу. Используйте sys.path.append(dir_name), чтобы добавить каталог к ​​тем, в которых Python ищет программы из операторов импорта.   -  person    schedule 17.08.2015
comment
Или вы также можете использовать для этого переменную среды PYTHONPATH.   -  person Juergen    schedule 17.08.2015
comment
Изменение CLASSPATH (переменная среды Java) устранило проблему с Python? Это кажется очень странным. Вы уверены, что вместо этого не изменили PYTHONPATH (переменную среды Python)?   -  person Chris Johnson    schedule 18.08.2015


Ответы (7)


Проблема в этой строке:

helpers.hello()

Замените его на это:

hello()

Теперь это работает, потому что вы импортировали только имя hello из модуля helpers. Вы не импортировали само имя helpers.

Итак, вы можете иметь это:

from helpers import hello
hello()

Или вы можете иметь это:

import helpers
helpers.hello()
person Michael Laszlo    schedule 17.08.2015
comment
Хотя это правда, что комбинация from helpers import hello/helpers.hello() не сработает, она также не приведет к ImportError. - person DSM; 17.08.2015

Я сбросил CLASSPATH, и он как-то работает нормально. Странная проблема. Спасибо всем!

person Jack Zhao    schedule 17.08.2015
comment
Лучшее, что можно сделать здесь (на мой взгляд), - это переместить ваш принятый ответ на этот и удалить изменения в вашем вопросе - на данный момент это выглядит немного запутанным. - person J Richard Snape; 18.08.2015
comment
Как вы сбрасывали CLASSPATH? - person a1letterword; 07.03.2018
comment
Не могли бы вы рассказать, как вы это сделали, иначе это не совсем ответ. - person Lamma; 21.08.2020

from helpers import hello
....
helpers.hello()   ## You didn't import the helpers namespace.

Ваша проблема заключается в понимании пространств имен. Вы не импортировали пространство имен помощников... поэтому интерпретатор не распознает помощников. Я настоятельно рекомендую вам прочитать о пространствах имен, так как они очень полезны в python.

Документ 1 по пространству имен

Официальный документ по пространству имен Python

Взгляните на эти ссылки выше.

person bud    schedule 17.08.2015
comment
Это уже было сказано, но не помогает с ошибкой импорта. - person Juergen; 17.08.2015
comment
Никто официально не представил концепцию пространств имен... Я думал, что некоторые документы помогут. Когда я впервые изучил Python, я был новичком в Java. Пространства имен были для меня чем-то чуждым, но как только я начал их использовать в достаточной мере, они стали моей второй натурой. - person bud; 17.08.2015
comment
Тем не менее это не помогает. - person Juergen; 17.08.2015

Интерпретатор Python не находит ваш модуль «помощники».

С какой операционной системой вы работаете?

Когда вы работаете в Unix/Linux или аналогичном, и ваши файлы находятся в том же каталоге, это должно работать. Но я слышал, что есть проблемы с работой, например, в Windows. Возможно, должен быть задан путь поиска.

См. здесь: https://docs.python.org/2/tutorial/modules.html#the-module-search-path

Редактировать: Майкл прав, когда вы делаете «из импорта помощников ...», тогда не модуль импортируется как таковой, а системе известен только привет!

Просто сделать

from helpers import hello
hello()

Or:

import helpers
helpers.hello()

Тем не менее, ошибка импорта должна быть решена. Для этого было бы полезно знать вашу систему и структуру каталогов! В такой системе, как Windows, может потребоваться установить PYTHONPATH соответствующим образом (см. ссылку выше).

person Juergen    schedule 17.08.2015
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. - person J Richard Snape; 18.08.2015
comment
@JRichardSnape: Когда вы полностью прочитаете мой пост, вы, возможно, увидите, что я дал другие подсказки, такие как путь поиска модулей, которые могут помочь. Я также оставил комментарий к посту, который остался без ответа. Когда вы читаете другие ответы здесь, вы можете увидеть, что многие дают меньше ответов. Почему вы не критикуете их? - person Juergen; 18.08.2015
comment
@JRichardSnape: Мне так надоели эти люди и система отзывов, когда вас постоянно критикуют, когда вы действительно пытаетесь помочь. Я также сделал обзор, но я попытался увидеть положительные стороны, а не только свод правил. - person Juergen; 18.08.2015
comment
жаль, что ты так себя чувствуешь. Как вы, очевидно, знаете - это пришло ко мне только что в серии обзоров - извините, если вы думаете, что я не уделил этому достаточно внимания, я только что увидел, что ошибка, которую вы заметили (хотя она действительна), не влияет на ImportError и что вы У меня был вопрос в начале ответа, который (на мой взгляд, YMMV) должен быть в комментарии. Иногда я испытываю такое же разочарование от отзывов и отметок. Но в целом я считаю, что плюсы перевешивают минусы. Я также стараюсь видеть положительные стороны, возможно, мне следовало отредактировать, а не пересматривать, как я это сделал. - person J Richard Snape; 18.08.2015
comment
@JRichardSnape: Спасибо за комментарий. Вчера у меня было несколько очень неприятных моментов со Stackoverflow. Я все больше и больше чувствую, что система обзора SO сводит помогающие обсуждения к разочаровывающему показухе силы, заключающейся в том, чтобы навязывать правила другим людям. Вместо того, чтобы дать течь полезным обсуждениям, вопросы останавливаются посреди обсуждения, потому что 5 человек думают, что в этом есть какая-то ошибка. Иногда только один решает, кто проголосует первым, а остальные четверо просто следуют за ним, потому что им не нужно время, чтобы прочитать весь контекст. -- - person Juergen; 18.08.2015
comment
@JRichardSnape: ... Итак, я выразил все это разочарование в своем ответе вам, что, возможно, было слишком много, потому что вы сделали только то, что от вас ожидали. Интересно прочитать о Stackoverflow: embeddedrelated.com/showarticle/741.php - person Juergen; 18.08.2015
comment
:) и спасибо за ответ. Я знаю, что вы имеете в виду. Может быть, это что-то, что можно взять с собой в Meta - хотя я видел, как обсуждения на эту тему и тому подобное были там избиты. Однако это проблема, особенно если пользователи со средним/высоким числом повторений, такие как вы (и я!), так считают. - person J Richard Snape; 18.08.2015
comment
@JRichardSnape: Я не думаю, что перенос этого в Meta поможет. У меня сложилось глубокое впечатление, что SO привлекает подходящих людей на высокие посты модераторов - и они вряд ли будут слушать, как вы сами убедились, - потому что любое изменение может подорвать и их позицию. Я думаю, что каждая система достигает точки некоторой устойчивости, и когда она наступает, появляется столько силы, которая препятствует изменению этой точки устойчивости, -- эта сила будет противодействовать любым усилиям движения. (Вы видели мою ссылку? Я потом отредактировал предыдущий комментарий) Есть и другие люди, которые чувствуют то же самое. - person Juergen; 18.08.2015
comment
Давайте продолжим обсуждение в чате. - person J Richard Snape; 18.08.2015

У меня была та же проблема: ModuleNotFoundError: нет модуля с именем «Module_Name». В моем случае и модуль, и скрипт, к которому я его вызывал, находились в одном и том же каталоге, однако мой рабочий каталог был неправильным. После того, как я изменил свой рабочий каталог, используя следующее, мой импорт сработал:

import os
os.chdir("C:\\Path\to\desired\directory")
person Bilbo Swaggins    schedule 12.06.2019

не могу комментировать, но два файла находятся в одной папке? Я бы попробовал:

from helpers.py import hello

person Ben Ference    schedule 17.08.2015
comment
Не работает. Система автоматически добавляет этот .py. - person Juergen; 17.08.2015

Файловая система :

__init__.py
helpers.py      <- 'hello' function 
utils
   __init__.py  <- functions/classes
   barfoo.py
main.py

в основном...

from helpers import hello
hello()
import utils        # which ever functions/classes defined in the __init__.py file. 
from utils import * # adds barfoo the namespace or you could/should name directly. 

следуйте инструкциям по импорту модулей в документации

person corn3lius    schedule 17.08.2015
comment
Я не знаю, почему все хотят форсировать пакет здесь. Python позволяет использовать автономные модули без пакетов и прочего. Я не вижу, как усложнение вещей поможет вопрошающему. См. здесь: docs.python.org/2/tutorial /modules.html#the-module-search-path - person Juergen; 17.08.2015