импорт из другой папки в virtualenv

#python #flask #pip #virtualenv

#python #flask #pip #virtualenv

Вопрос:

Я следую руководству Flask Mega, и я сталкиваюсь с проблемой, как только я добираюсь до второй части и реструктурирую свою структуру папок, чтобы соответствовать их, я не могу импортировать Flask.

Моя текущая структура папок выглядит следующим образом

 /FlaskTest
    /app
        /static, templates etc
    /flask
        /virtualenv folders etc
    /tmp
    run.py
  

насколько я могу судить, структуры папок идентичны, кроме именования каталога верхнего уровня.

в моем __init__.py файл (/app/__init__.py ), я делаю так, как указано в руководстве,

 from flask import Flask

app = Flask(__name__)
from app import views
  

Я получаю сообщение об ошибке импорта, которое «не удается импортировать имя ‘Flask'». Я предполагаю, что проблема заключается в том, что пакет flask был установлен в /flask/lib/site-packages .

Мой вопрос: как я могу ссылаться на подпапку flask / site-packages?

Я прочитал документацию по системе импорта python, и из того, что я могу сделать из нее, прочитав ее в первый раз, мне, вероятно, нужно будет сделать что-то вроде из flask import flask.Flask или что-то в этом роде.

ОБНОВЛЕНИЕ: итак, после обхода каталога и проверки списка файлов я понял, что flask недоступен для моего каталога приложений. Я запустил pip install flask в каталоге приложения. Сейчас мой сайт работает, но я не уверен, что это лучшая практика работы с Python. Пожалуйста, внесите некоторую ясность в то, что является наилучшей практикой для установки пакетов и где находятся пакеты.

ОБНОВЛЕНИЕ 2: после создания каталога с именем standalone. В этой папке я создал виртуальную среду под названием standalone-test. Однажды я сделал это, я также отредактировал приложение и скопировал его содержимое из FlaskTest, чтобы код был идентичным. Я смог запустить run.py скрипт с помощью python run.py , но я не могу запустить python -m app , как вы сказали, не столкнувшись с ошибкой. Ошибка заключается в следующем, если это помогает.

«Нет имени модуля app.main; «приложение» является пакетом и не может быть выполнено напрямую.

Я могу запустить python run.py , как я уже упоминал, но я не могу запустить python -m app команду, как вы упомянули

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

1. Вам нужно запускать команды из FlaskTest/ подкаталога.

Ответ №1:

Я думаю, что что-то пошло не так в вашей среде выполнения. Вот некоторые пояснения.

Virtualenv

Смотрите Документацию virtualenv

Если вы следовали руководству:

  • flask Каталог — это ваш virtualenv,
  • В системе posix у вас есть flask/bin подкаталог или
  • В системе Windows у вас есть flaskScripts подкаталог.

Я предполагаю, что вы используете систему posix.

Чтобы активировать ваш virtualenv, выполните:

 source flask/bin/activate
  

Ваше приглашение должно измениться на что-то вроде: (flask)$ .

Чтобы перечислить установленные библиотеки, используйте pip :

 pip list
  

Убедитесь, что вы видите Flask. В руководстве предлагается установить множество плагинов Flask, поэтому есть много чего-то похожего на Flask…

Если Flask отсутствует, установите его:

 pip install Flask
  

Запустите ваше приложение

Ваше приложение находится в app каталоге, в нем есть __init__.py файл (это пакет Python).

В этом файле у вас есть:

 from flask import Flask

app = Flask(__name__)
from app import views
  

Из вашего FlaskTest/ каталога попробуйте запустить этот скрипт следующим образом:

 cd FlaskTest/  # if not in this directory
python -m app
  

Это должно импортировать Flask , создать ваш app экземпляр (но не запускать его), импортировать views модуль.

Если app/views.py существует, у вас не должно быть ошибок.

=> на данный момент мы смоделировали, что run.py импортирует…

Теперь напишите run.py в своем FlaskTest/ каталоге:

 #!flask/bin/python
from app import app
app.run(debug=True)
  

Запустите его следующим образом:

 python run.py
  

Обратите внимание, что shebang #!flask/bin/python необычен, но должен работать в контексте руководства.

Это должно запустить ваш http-сервер…

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

1. Я обязательно попробую еще раз, но я установил его, просто запустив pip install virtualenv, а затем создал папку, выполнил команду create, а затем запустил скрипт activate.bat (система Windows). Побочный вопрос, имеющий init.py файл превращает каталог в пакет? Я собираюсь попробовать создать другую виртуальную среду и посмотреть, что получится, когда я попытаюсь запустить команды установки из учебника.

2. Итак, я немного поэкспериментировал, и когда я нахожусь в контексте моей виртуальной среды (в моем приглашении рядом с ним указано имя виртуальной среды), и я нажимаю install flask, он устанавливается глобально. Насколько я понимаю virtual env, это ненормальное поведение. Я собираюсь начать учебник заново в другом каталоге. И поделюсь своими результатами / опытом.

3. Обновил OP моими тестами / результатами.