Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么';在Google应用程序引擎中查找相对路径的好方法是什么?_Python_Google App Engine - Fatal编程技术网

Python 什么';在Google应用程序引擎中查找相对路径的好方法是什么?

Python 什么';在Google应用程序引擎中查找相对路径的好方法是什么?,python,google-app-engine,Python,Google App Engine,所以我用GAE做了一些琐碎的“热身”应用。现在我想构建一个更复杂的目录结构。大致如下: siteroot/ models/ controllers/ controller1/ controller2/ ... templates/ template1/ template2/ ... ……等等。控制器将是处理请求的Python模块。然后,他们需要在相关文件夹中找到(Django

所以我用GAE做了一些琐碎的“热身”应用。现在我想构建一个更复杂的目录结构。大致如下:

siteroot/
    models/
    controllers/
        controller1/
        controller2/
        ...
    templates/
        template1/
        template2/
        ...
……等等。控制器将是处理请求的Python模块。然后,他们需要在相关文件夹中找到(Django样式)模板。我见过的大多数演示应用程序都会像这样解析模板路径:

path = os.path.join(os.path.dirname(__file__), 'myPage.html')
template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")
…file属性解析为当前正在执行的脚本。因此,在我上面的示例中,如果一个Python脚本在controller1/中运行,那么“myPage.html”将解析为同一个目录——controller1/myPage.html——我宁愿将Python代码和模板清晰地分开

我拼凑的解决方案感觉。。。哈奇:

base_paths = os.path.split(os.path.dirname(__file__))
template_dir = os.path.join(base_paths[0], "templates")
因此,我只是剪掉当前运行脚本路径的最后一个元素,并将模板目录附加到新路径。我见过的其他(非GAE特定的)用于解析Python路径的解决方案似乎非常重要(例如将路径拆分为列表并相应地进行操作)。Django似乎对此有一个答案,但我宁愿坚持使用GAE API,而不是创建一个完整的Django应用程序并为GAE修改它


我假设任何硬编码的应用程序都不会启动,因为这些应用程序都存在于谷歌的无限服务器场中。那么有什么更好的方法呢?

函数返回绝对路径,使用相对路径。使用
os.path.abspath(os.path.curdir)
执行控制器时,查看当前目录是什么,并构建相对于该位置的模板路径(当然不包括
os.path.abspath
部分)

这仅在当前目录位于siteroot内的某个位置时有效,否则您可以执行以下操作:

path = os.path.join(os.path.dirname(__file__), 'myPage.html')
template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates")

正如托尼所建议的,你不能使用相对路径,因为你不能保证从工作目录到应用程序目录的路径保持不变

正确的解决方案是使用os.path.split,或者使用类似于:

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html')
我通常的方法是使用上述方法生成模板目录的路径,并将其存储为控制器对象的成员,并提供一个“getTemplatePath”方法,该方法采用提供的文件名并将其与basename联接