2015-06-11 42 views
2

我的项目具有以下结构:Python的绝对进口不工作的Ubuntu服务器上

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和虚拟环境文件夹内的Python二进制文件夹/server/env/bin/

但是,当我推到这个运行Ubuntu生产服务器,在那里我安装所有的依赖全球,当我运行它不断抛出错误no module named server.app

python server/app/app.py 

有谁知道为什么吗?

+0

没有服务器/ app.py然而服务器/ app/app.py – Rash

+0

@Rash感谢提醒,只是纠正它。 – benjaminz

+1

在您的IDE环境中,他们自动编辑您的Python源路径。您需要将您的路径添加到Python路径。使用这个sys.path.append('/ path/to/the/example_file.py') – Rash

回答

1

任何IDE环境通常会设置pythonpath。例如。在Eclipse中右键单击您的项目并查看属性。你会看到你的主项目被列在pythonpath中。该路径用于查找模块。

现在在您的生产代码中,您不在IDE中。所以普通的python解释器找不到你的路径。因此你需要指定这个。

一种方法是在导入之前添加sys.path.append('/path/to/the/project')(这应该在执行的第一个脚本中完成,在这种情况下为app.py,这样您只需要执行一次)。

您还可以将您的路径永久添加到您的生产环境中。见this后。

0

As @Rash提到,您的IDE很可能会将包含/server的目录添加到您的python path。您可以在您的app.py中加入

import sys 
print "\n".join(sys.path) 

之前您的进口。

当您手动运行您的应用程序时,即python server/app/app.py,您的server目录的父级显然不在您的python路径中,因此您必须添加自己。

+0

如果我使用@ Rash的建议'sys.path.append('/ path/to/the/example_file.py')',我把这个代码放在哪个文件中?谢谢! – benjaminz

+0

与'sys.path'混淆通常不是一个坏主意。更新你的'PYTHONPATH'环境变量(将运行你的应用程序的用户之一)会更好。虽然我们在这里,但在生产环境中使用virtualenv也更为安全。 –

相关问题