簡體   English   中英

uwsgi + Flask + virtualenv 導入錯誤:沒有名為站點的模塊

[英]uwsgi + Flask + virtualenv ImportError: no module named site

(SO 上的其他帖子類似,但都沒有 uwsgi + Flask + virtualenv 的特定組合)( 這是最接近的

我通過 apt-get 安裝了 uwsgi。 我也試過 pip install wsgi。 兩者都給了我同樣的問題。

測試命令:

sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H myvirtualenv

結果:

Python version: 2.7.4 (default, Apr 19, 2013, 18:35:44)  [GCC 4.7.3]
Set PythonHome to myvirtualenv
ImportError: No module named site

否則我可以在虛擬環境中運行我的應用程序。

虛擬環境的路徑錯誤。 這就是這個錯誤的原因。

我正在使用 virtualenvwrapper,我的虛擬環境設置在 ~/.virtualenvs。 所以在我的情況下,uwsgi 調用看起來像

sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H ~/.virtualenvs/myapp

希望下次有人來找這個時這會有所幫助。

感謝 Cody 在評論中指出。

首先查看@JRajan 的回答。

如果您確定只想抑制錯誤而不實際解決潛在問題,則應在命令中添加--no-site或在 uwsgi.ini 文件中添加no-site=true

就我而言,問題是 uWSGI 嘗試使用的 python 版本。

我的項目是用 python 3.4 編寫的,但我沒有在 uWSGI 配置中指定它。 所以uWSGI嘗試使用python 2並嘗試從virtualenv中的文件夾lib/python2.7導入模塊。

所以我收到了“沒有名為站點的模塊”錯誤,因為所有模塊,包括站點模塊,都在 lib/python3.4 內部,而不是 lib/python2.7。

為了解決這個問題,我必須做兩件事:

  • 為 uWSGI 安裝 python3 插件,使用:
    apt-get install uwsgi-plugin-python3

  • 在 .ini 配置文件中使用它,包括:
    plugins = python34

希望這可以幫助將來遇到同樣問題的人。

根據要求,下面是我的 .ini 文件:

[uwsgi]
base = /your/app/path

pythonpath = %(base)
module = your_module_name

callable = app #Here you put the name of the variable which holds your app inside your module

home = /your/virtualenv/path
plugins = python34

master = true
processes = 2

uid = www-data
gid = www-data

socket = /path/to/socket
chmod-socket = 660

die-on-term = true

logto = /var/log/uwsgi/%n.log

我以前有過類似的問題。 我的問題是我的 ubuntu 系統上有 python2.x 和 python3.x,我希望我的項目在安裝了 python3 環境的虛擬環境中運行。 我是如何解決這個問題的:

apt-get 安裝 python3-pip

pip3 安裝 uWSGI

就這樣。

如果您的虛擬環境在 Python3 上運行,那么您必須使用 pip3 安裝 uwsgi,而不是 pip 否則,版本不匹配將導致此導入問題

pip uninstall uwsgi    
pip3 install uwsgi

出於多種原因,這可能不利於安全。 它適用於測試。 但在生產中使用此精確解決方案之前請檢查安全性

可能發生此錯誤的另一個原因是權限相關。 如果使用 .ini 文件,如 uWSGI for django 的官方教程中所述,您可能已經使用用戶和組創建了 ini 文件,這使得運行該進程的用戶無法訪問該文件。

檢查文件的所有者和權限以及它所在的目錄路徑。使用 chown 和 chmod 設置所需的權限。

sudo chown -R www-data:www-data /srv

sudo chmod 0775 -R /srv

就我而言,我使用 vagrant box 進行測試,默認用戶是“vagrant”,而 nginx 為用戶和組使用 www-data。 我已將項目中所有文件的所有者設置為 www-data 用戶和組,並將 vagrant 用戶添加到 www-data 組。

sudo gpasswd -a vagrant www-data

我不確定這是否是良好的安全實踐,因此當需要將其投入生產時,我將與我的系統管理員合作。 但是對於我的測試環境它有效。 無論哪種方式,對於許多這些問題,權限都是需要仔細研究的。

當我的自制軟件將我的 Python 版本更新為 Python 3.7 並且它停止工作時,我遇到了這個問題。 對我brew info pythonbrew info python - 它會顯示所有可用的 Python 版本。 比我使用brew switch python 3.6.5回滾到 Python brew switch python 3.6.5

之后,我只是使用以下命令重新安裝了我的 uWSGI:

pip3 uninstall uwsgi
pip3 install uwsgi

這解決了它。 如果您不確定您使用的是哪個版本的 Python, brew info python顯示安裝日期。 此外,您可以使用pip3 list檢查是否為當前版本安裝了 uWSGI。

希望這可以幫助!

我遇到了同樣的問題,我的問題是運行 uwsgi 的 python 版本。 uwsgi 在 python2 上運行,但我的 virtualenv python 路徑設置為 python3。 這造成了沖突,它一直無法找到已安裝的站點包。

仔細檢查運行 uwsgi 的 python 版本,使其與您在 virtualenv 上設置的版本相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM