uwsgi里面可调用文件模块导入错误

时间:2017-07-22 13:16:23

标签: python nginx uwsgi

我正在用nginx实现uwsgi,我在我的app目录中使用这个结构:

  

myappfolder / my_app

     

myappfolder / my_app / main.py

     

myappfolder / my_app_venv

     

myappfolder / wsgi.py

我已经设置了一个python virtualenv来保存我的应用程序并在其中安装了uwsgi(在https://www.digitalocean.com/community/tutorials/how-to-deploy-python-wsgi-applications-using-uwsgi-web-server-with-nginx的教程之后)

在该链接中提到的默认设置的开头,服务器工作正常,我使用此命令运行uwsgi:uwsgi --socket 127.0.0.1:12345 -w wsgi &,但在调整了wsgi.py文件中的代码并将其设为此方式:

#!/usr/bin/env python3

import sys
sys.path.append('/root/myappfolder')

from my_app.main import Main

fff = Main()

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [fff.sayHello(), str(env)]

然后,当我运行uwsgi时,它给了我来自python interpreter的错误=> ImportError: No module named my_app.main

my_app / main.py档案中:

#!/usr/bin/env python3

class Main:
    def sayHello(self):
        return("hello world!")

问题的原因是什么?

更新1: 即使在import sys文件中的wsgi.py后使用sys.path.append('the path to myappfolder')它也没有效果。

问题简化:让我简化一下我的问题:为什么virtualenv的python解释器找不到用于uwsgi的可调用文件旁边的模块(在我的情况下{{1文件)?

更新2 :我将wsgi.py文件从main.py文件夹移到了一个上方路径,这意味着它现在位于my_app,现在是{{1} }文件可以查看导入它。为什么当它在子目录下时,myappfolder / main.py文件没有看到它?

1 个答案:

答案 0 :(得分:3)

我终于找到了发生的事情。 uwsgi 正在使用Python 2.7,它要求您在每个文件夹模块中使用 __ init __。py 文件。即使是空文件。现在修复了问题,从问题中提到的目录结构转移到下面写的那个:

myappfolder / my_app

myappfolder / my_app / main.py

myappfolder / my_app / __init__.py      # empty file

myappfolder / my_app_venv

myappfolder / wsgi.py

这是python 2.X和3.X的最大区别,这让我陷入了将近两天的困境。