Python 绝对导入无法在 Ubuntu 服务器上运行
Python absolute import not working on Ubuntu server
我的项目结构如下:
server/ (root of project)
|
|--- __init__.py
|--- requirements.txt
|--- env/ (virtual environment)
|--- app/ (main app folder)
|--- __init__.py (defines a 'app = Flask(__name__)' object)
|--- app.py (runs app on local server)
|--- models.py
|--- views.py
我在本地机器上 app.py
导入不同模块的方式是 do
:
# /server/app/app.py
from server.app import app
from server.app.models import *
from server.app.views import *
它在我的本地机器上运行良好(使用 PyCharm IDE,以及虚拟环境文件夹 /server/env/bin/
中的 Python 二进制文件。
但是,当我将其推送到生产服务器 运行ning Ubuntu 时,我在其中全局安装了所有依赖项,当我 运行:
python server/app/app.py
有谁知道为什么?
正如@Rash 提到的,您的 IDE 很可能将包含 /server
的目录添加到您的 python path。您可以通过添加
在 app.py
中查看
import sys
print "\n".join(sys.path)
在您导入之前。
当您手动 运行 您的应用程序时,即 python server/app/app.py
,您的 server
目录的父目录显然不在您的 python 中路径,所以你必须自己添加。
任何 IDE 环境通常设置 python 路径。例如。在 Eclipse 中右键单击您的项目并查看属性。您会看到您的主项目列在 python 路径中。此路径用于定位模块。
现在在您的生产代码中,您不在 IDE 中。所以普通的 python 解释器找不到你的路径。因此你需要指定这个。
一种方法是在执行导入之前添加 sys.path.append('/path/to/the/project')
(这应该针对第一个执行的脚本完成,在本例中为 app.py
,这样您只需要执行此操作一次)。
您还可以将您的路径永久添加到您的生产环境中。参见 this post。
我的项目结构如下:
server/ (root of project)
|
|--- __init__.py
|--- requirements.txt
|--- env/ (virtual environment)
|--- app/ (main app folder)
|--- __init__.py (defines a 'app = Flask(__name__)' object)
|--- app.py (runs app on local server)
|--- models.py
|--- views.py
我在本地机器上 app.py
导入不同模块的方式是 do
:
# /server/app/app.py
from server.app import app
from server.app.models import *
from server.app.views import *
它在我的本地机器上运行良好(使用 PyCharm IDE,以及虚拟环境文件夹 /server/env/bin/
中的 Python 二进制文件。
但是,当我将其推送到生产服务器 运行ning Ubuntu 时,我在其中全局安装了所有依赖项,当我 运行:
python server/app/app.py
有谁知道为什么?
正如@Rash 提到的,您的 IDE 很可能将包含 /server
的目录添加到您的 python path。您可以通过添加
app.py
中查看
import sys
print "\n".join(sys.path)
在您导入之前。
当您手动 运行 您的应用程序时,即 python server/app/app.py
,您的 server
目录的父目录显然不在您的 python 中路径,所以你必须自己添加。
任何 IDE 环境通常设置 python 路径。例如。在 Eclipse 中右键单击您的项目并查看属性。您会看到您的主项目列在 python 路径中。此路径用于定位模块。
现在在您的生产代码中,您不在 IDE 中。所以普通的 python 解释器找不到你的路径。因此你需要指定这个。
一种方法是在执行导入之前添加 sys.path.append('/path/to/the/project')
(这应该针对第一个执行的脚本完成,在本例中为 app.py
,这样您只需要执行此操作一次)。
您还可以将您的路径永久添加到您的生产环境中。参见 this post。