【问题标题】:Error "no such file or directory" when using os.chdir in Flask在 Flask 中使用 os.chdir 时出现错误“没有这样的文件或目录”
【发布时间】:2016-06-22 05:36:26
【问题描述】:

我可以使用 Flask 启动应用程序,它会加载并显示 localhost 查看信息,然后立即退出并出现错误:

can't open file 'server.py': [Errno 2] No such file or directory

这通常是您在文件夹中没有该名称的文件时得到的,但在这种情况下肯定有,因为它最初成功加载它

编辑:为server.py 添加代码:

from flask import Flask, jsonify
from services.controller import Controller

app = Flask(__name__)
path = '/Users/bhouwens/some/path'
ctrl = Controller(path)

@app.route('/')
def home():
    stats = {'path' : path}

    return jsonify(stats)

@app.route('/task-runners')
def task_runners():
    return jsonify({'task_runners': ctrl.task_runners})

if __name__ == '__main__':
    app.run(debug=True)

【问题讨论】:

  • 文件的权限是否正确?您可以为文件和您正在使用的命令行添加一个 ls -l 输出,以防出现错误?
  • 如何运行代码。您只是输入python server.py 还是使用 gunicorn 或 mod_wsgi 运行应用程序 ..?是否有错误消息的回溯?您在哪里看到错误消息?在 shell 上还是在日志文件中?
  • Yip 只是python server.py,shell 中的错误消息。我已将其缩小为Controller 模块中os.chdir 的问题,由于某些新的和无法解释的原因,导致服务器崩溃。我的猜测是它试图继续从新目录提供服务,即使我只想访问那里的文件
  • 能否也显示控制器代码?听起来确实有问题。

标签: python python-2.7 flask


【解决方案1】:

如前所述,如果不破坏服务器,Flask 应用程序中的os.chdir 似乎是不可能的。

就我而言,我正在尝试使用另一个模块读取另一个目录中的文件,其中目录的路径作为此行中的参数传递给模块:

ctrl = Controller(path)

我发现Python提供的open函数可以打开其他目录中的文件,所以我通过使用解决了这个问题

with open(path + '/file_to_open.txt', 'r') as file:

来自Controller 模块。

希望这可以帮助遇到同样问题的其他人。

【讨论】:

  • 在另一个文件夹中打开文件是正确的方法。使用os.path.join(path, 'file_to_open.txt')chdir 有几个副作用。
【解决方案2】:

就像你已经发现的那样,你不能这样做chdir

import os
from flask import Flask

app = Flask(__name__)
os.chdir('..')

app.run(debug=True)

当你执行这个文件时,输出如下:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
/usr/bin/python: can't open file 'example.py': [Errno 2] No such file or directory

【讨论】:

    【解决方案3】:

    我不知道到底是什么导致了这个问题,但是如果你在os.chdir() 之后检查app.root_path,你会发现它搞砸了,更改app.config['APPLICATION_ROOT'] 也不能解决这个问题,你需要更改@ 987654324@ 属性手动使用新的目录路径,您可以像 app = Flask.flask(__name__, root_path=BASE_DIR) 那样在初始化烧瓶应用程序时执行此操作,但您也可以在烧瓶运行时随时更改它。
    如果不这样做,Flask 会这样做:
    如果您的应用位于 ~/one/two/three/app.py 并且您尝试从 ~/one ,在应用程序内部执行os.chdir()os.path.dirname(os.path.abspath(__file__)) 会导致app.root_path 等于'~/one/two/three/two/three',它基本上使您调用应用程序的位置和应用程序文件本身,如果您从 ~/one/two/three/four/five 运行应用程序并在应用程序内执行 os.chdir()os.path.dirname(os.path.abspath(__file__))这将导致 app.root_path 等于 '~/one' ,即从 app.py 目录开始并向后截断远离应用程序文件的目录数。
    os.path.dirname(os.path.abspath(__file__)) 等于 '~/one/two/three'
    奇怪的错误:(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多