¿Cómo maneja PyCharm las importaciones relativas de módulos?

Tengo la siguiente estructura de directorio en un proyecto que se ha heredado:

work_dir/ FlaskControlPanel/ static/ templates/ app.py models/ __init__.py model1.py model2.py script1.py script2.py 

Desde script1.py o script2.py puedo ejecutar esto from models.model1 import Class1, Class2 y funciona. Al usar PyCharm, puedo usar la misma línea de importación dentro de app.py

Sin embargo, cuando voy a implementar esto en mi servidor dev, esto no funciona desde app.py Me sale el error ImportError: No module named models.model1

¿Qué hace PyCharm para solucionar esto?

¿Cómo puedo arreglar mi importación en app.py para que funcione tanto en PyCharm como cuando ejecuto mi aplicación Flask en el servidor de desarrollo? Por lo general, lo ejecuto en el servidor simplemente usando python app.py desde el directorio FlaskControlPanel .

work_dir asegurarse de que work_dir se agregue a sys.path o PYTHONPATH.

Python agregará la carpeta principal del archivo de script en sys.path automáticamente. Entonces, si ejecuta app.py en su shell, solo FlaskControlPanel se insertará en sys.path y python puede encontrar dónde están los models .

Pero en pycharm, siempre agregará work_dir en sys.path. Es por eso que puedes ejecutar app.py sin ningún problema.

Para su problema, puede cambiar el directorio a work_dir y ejecutar PYTHONPATH=. python FlaskControlPanel/app.py PYTHONPATH=. python FlaskControlPanel/app.py

https://docs.python.org/2/using/cmdline.html#interface-options

Ejecute el código Python contenido en el script, que debe ser una ruta del sistema de archivos (absoluta o relativa) que haga referencia a un archivo Python, un directorio que contenga un archivo __main__.py o un archivo zip que contenga un archivo __main__.py.

Si se da esta opción, el primer elemento de sys.argv será el nombre del script como se indica en la línea de comandos.

Si el nombre del script se refiere directamente a un archivo Python, el directorio que contiene ese archivo se agrega al inicio de sys.path, y el archivo se ejecuta como el módulo __main__.

Si el nombre del script se refiere a un directorio o archivo zip, el nombre del script se agrega al inicio de sys.path y el archivo __main__.py en esa ubicación se ejecuta como el módulo __main__.