#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