【问题标题】:Python absolute import not working on Ubuntu serverPython 绝对导入在 Ubuntu 服务器上不起作用
【发布时间】:2015-06-11 17:08:22
【问题描述】:

我的项目结构如下:

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

有人知道为什么吗?

【问题讨论】:

  • 没有 server/app.py 但是有 server/app/app.py
  • @Rash 感谢提醒,刚刚更正了。
  • 在您的 IDE 环境中,它们会自动编辑您的 python 源路径。您需要将您的路径添加到 python 路径。使用这个 sys.path.append('/path/to/the/example_file.py')
  • 嗯。不幸的是,当你们使用@myusername 提到我时,我没有收到通知。有趣的。可能是因为你在我的用户名后面加了撇号
  • @Rash 我们在此评论区scope 中提到了你,也许这就是原因。

标签: python import server


【解决方案1】:

任何 IDE 环境通常都会设置 pythonpath。例如。在eclipse中右键单击您的项目并查看属性。您将看到您的主项目列在 pythonpath 中。此路径用于定位模块。

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

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

您还可以将路径永久添加到生产环境中。请参阅this 帖子。

【讨论】:

    【解决方案2】:

    正如@Rash 提到的,您的IDE 很可能将包含/server 的目录添加到您的python path。您可以通过添加

    在您的 app.py 中检查这一点
    import sys
    print "\n".join(sys.path)
    

    在您的导入之前。

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

    【讨论】:

    • 如果我要使用@Rash 的建议sys.path.append('/path/to/the/example_file.py'),我应该将这段代码放在哪个文件中?谢谢!
    • sys.path 混在一起往往不是一个坏主意。最好更新您的 PYTHONPATH 环境变量(将运行您的应用程序的用户之一)。虽然我们这样做了,但在生产中使用 virtualenv 也更安全......
    猜你喜欢
    • 2018-01-08
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2016-10-13
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多