【问题标题】:Python's working directory when running with WSGI and Apache使用 WSGI 和 Apache 运行时 Python 的工作目录
【发布时间】:2012-08-22 21:38:18
【问题描述】:

我有一个网络应用程序,除其他外,它将查询数据库并使用数据创建一个 Excel 电子表格。在将文件发送到客户端计算机之前,我需要将电子表格保存到服务器的磁盘。我正在使用 Flask 框架和 openpyxl 来生成电子表格。在 Flask 的开发服务器上运行时一切正常,但真正的服务器是带有 WSGI 的 Apache2。当我在那里运行它时,它会在尝试保存电子表格时引发“权限被拒绝”错误。我不知道在 Apache/WSGI 中运行时 Python 的工作目录是什么。

有没有办法,可能在 WSGI 配置文件中,改变工作目录,或者以某种方式控制它的保存位置?如果可能的话,我想使用相对路径进行保存(它使代码更便携),这就是为什么更改工作目录是最好的解决方案。

【问题讨论】:

    标签: apache2 mod-wsgi


    【解决方案1】:

    我有一个类似的问题,我想使用带有相对路径的 glob()。它在我的开发环境中有效,但在带有 mod_wsgi 的服务器上无效。我发现here 有一个“home=”选项,您可以将其添加到 WSGIDaemonProcess 指令中以设置应用程序的初始工作目录。您可以在虚拟主机文件中找到它(在我的系统上的 /etc/apache2/sites-available/mysite.conf 中)

    【讨论】:

    • WSGIDaemonProcess 不适用于 Windows。
    【解决方案2】:

    你不应该改变工作目录。

    用途:

    import os
    here = os.path.dirname(__file__)
    

    变量here 将包含该代码文件所在的目录。然后,您可以为与之相关的事物构建绝对路径。

    database = os.path.join(here, 'database.db')
    

    请注意,在 Apache 中运行您的代码的用户仍需要对该目录的读/写权限。

    与往常一样,请务必阅读文档。文档的相关部分是:

    【讨论】:

    • 太棒了!谢谢!最好的部分是它是一个便携的解决方案。
    • 你也可以here = os.getcwd()
    • 不,您不能使用 getcwd(),因为 mod_wsgi 下的当前工作目录通常永远不会是代码所在的位置。阅读引用的第一个链接,因为它解释了这一点。
    • 你是对的。 getcwd() 与 os.path.dirname(__file) 不同。
    • 请注意这是__file__中的额外_
    【解决方案3】:

    虽然添加到相对目录的路径有效,但您可能需要更改大量代码。

    从 WSGIDaemonProcess 更改主页可以工作,但您需要为每个虚拟主机设置一个

    在脚本开头重置 cwd:

    here = os.path.dirname(__file__)
    os.chdir(here)
    

    快速解决方法

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 2016-05-07
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2012-08-21
      相关资源
      最近更新 更多