Модуль Python не найден при запуске из терминала

#python

#python

Вопрос:

Я пытался выяснить, как заставить импортированные модули работать в моем скрипте Python. Он работает в pycharm, поэтому я знаю, что это что-то с конфигурацией пути, когда я пытаюсь запустить его в терминале unix.

При запуске на ubuntu я получаю это: Трассировка (последний последний вызов):

   File "main_app.py", line 12, in <module>
    from flask_app.python_scripts import canvas_test
ModuleNotFoundError: No module named 'flask_app'
  

Есть ли команда, которую мне нужно запустить с терминала, или что-то, что мне нужно добавить в мой скрипт на python?

Комментарии:

1. Установили ли вы модуль flask, если да, то совместим ли он с вашей версией python?

2. попробуйте export PYTHONPATH=/the/dir/of/flask/app:${PYTHONPATH}

3. @YANGGHG Спасибо, мне просто запустить это в терминале. Также у меня установлена flask

4. @the_martian вам следует заменить путь к вашему родительскому каталогу flask_app.

5. Другая возможность заключается в том, что вы запускаете python /something/else/app.py напрямую, но причина та же 🙂

Ответ №1:

Что мы делаем в моей компании, так это имеемinit.py файл в каждом каталоге, содержащий скрипты утилиты Python. Скрипты импортируют init для чтения этого файла. Этот файл изменяет путь python, чтобы включить пути к нашей библиотеке утилит и некоторым библиотекам сторонних производителей. Поскольку все находится в одном и том же дереве исходных текстов, init.py файл использует местоположение самого себя, чтобы превратить относительные пути в абсолютные пути. Вот один из наших таких файлов:

 import sys, os

inletPath = os.path.dirname(__file__)   "/../../.."
sys.path.append(inletPath   "/common/python")
sys.path.append(inletPath   "/inletfetch/common/common-pyutil")
sys.path.append(inletPath   "/inletfetch/common/common-pyutil/thirdparty")
  

inletPath — это корень нашего дерева исходных текстов. Конкретные пути вычисляются относительно исходного корня

Мы не пытаемся совместно использовать эти файлы в разных каталогах. Мы просто помещаем его в любой каталог, содержащий любые скрипты python, которые мы выполняем напрямую.

Самое замечательное в этом то, что все, что вам нужно сделать при создании нового скрипта, это добавить «import init» в начале его, прежде чем импортировать что-либо еще, и все остальное будет найдено.

Ответ №2:

Ваша структура каталогов должна быть настроена так, чтобы оба flask_app.py и main_app.py находятся в том же каталоге.

 $ ls
flask_app.py  main_app.py  __pycache__
  

Содержимое файлов…

 <flask_app.py>
def canvas_test():
    return "canvas test print"

<main_app.py>
from flask_app import canvas_test
canvas = canvas_test()
print(canvas)
  

При запуске вы получаете…

 $ python main_app.py 
canvas test print
  

Если то, что вы импортируете, находится не в том же каталоге, тогда вам нужно использовать оператор относительного импорта, например
from ..flask_app import canvas_test

или включите ваш модуль в свой PYTHONPATH

Комментарии:

1. Вы не можете использовать относительный импорт, если это основной модуль: P