Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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模块自动加载程序?_Python_Mod Wsgi_Wsgi_Autoloader - Fatal编程技术网

Python模块自动加载程序?

Python模块自动加载程序?,python,mod-wsgi,wsgi,autoloader,Python,Mod Wsgi,Wsgi,Autoloader,如何自动加载保存在不同目录和子目录中的所有模块 我已经看到这是使用\uuuuuuuuuuuuuuuuuuuuuuuuuuu导入的,但它仍然不是我心目中的自动加载 我在想类似的事情。更好的是像这样的 从我到目前为止收集的研究结果来看,autoloader在Python中似乎并不流行(因为我是Python新手,所以不能确定)。在Python中自动加载是不可行的吗 到目前为止,我的自动加载代码 import os import sys root = os.path.dirname(__file__)

如何自动加载保存在不同目录和子目录中的所有模块

我已经看到这是使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuu导入的,但它仍然不是我心目中的自动加载

我在想类似的事情。更好的是像这样的

从我到目前为止收集的研究结果来看,autoloader在Python中似乎并不流行(因为我是Python新手,所以不能确定)。在Python中自动加载是不可行的吗

到目前为止,我的自动加载代码

import os
import sys

root = os.path.dirname(__file__)
sys.path.append(root + "/modules")
sys.path.append(root + "/modules/User")
sys.path.append(root + "/modules/Article")

# IMPORTS MODULES
module = __import__("HelloWorld")
my_class = getattr(module, "HelloWorld")

# This is our application object. It could have any name,
# except when using mod_wsgi where it must be "application"
def application(environ, start_response):

    results = []

    helloWorld = my_class()
    results.append(helloWorld.sayHello())

    output = "<br/>".join(results)

    print output

    ...
如果我有很多文件夹和子文件夹呢?我要把它们都列出来吗?最终会有一长串,不是吗

此外,使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
似乎与此

import os
import sys

root = os.path.dirname(__file__)
sys.path.append(root + "/modules")
sys.path.append(root + "/modules/User")
sys.path.append(root + "/modules/Article")

# IMPORTS MODULES
import hello
import HelloWorld

from HelloWorld import HelloWorld

# This is our application object. It could have any name,
# except when using mod_wsgi where it must be "application"
def application(environ, start_response):
在我看来,后者更漂亮、更整洁


有什么想法吗?

TL;DR:忘掉它,使用显式导入

详细回答:

Python不是PHP——既不是从技术角度,也不是从设计/哲学角度

Python哲学的一部分(aka“”)是“显式优于隐式”、“可读性很重要”和“面对歧义,拒绝猜测的诱惑”——这使得像PHP的“自动加载”这样的“特性”非常不和谐,如1所示。它比“导入mymodule”或“从mymodule导入SomeName”更不明确,2。它的可读性也很差(您不清楚名称从何处导入),3。当两个或多个模块定义一个相同的名称时(这在Python中非常有效且非常常见),它必须尝试并猜测您想要哪个名称(这在技术上是不可能的)


从技术角度来看,您不可能以可靠的方式在Python中实现这样的功能。在上面虽然PHP的
require
语句和Python的
import
语句看起来很相似,但它们的工作方式完全不同,“执行模型”也完全不同。

以PHP的方式自动重新加载源代码在Python中并不实用。我建议你去读一读:

如果您真的需要一些东西,请参阅本文中描述的可与mod_wsgi一起使用的自动代码重新加载程序的详细信息。但千万不要在生产系统上使用它

如果您正在进行开发,坦率地说,使用mod_wsgi-express可能会更好。见:


mod_wsgi-express的一个功能是
--reload on changes
选项,它为您实现自动代码重新加载。

抱歉,删除了我的评论。我不确定这是否有帮助。基本上是将
\uuuu init\uuuuu.py
文件添加到文件夹中。没关系。也许我应该看看如何将这些模块转换成软件包?我已经在每个文件夹中设置了
\uuuuu init\uuuuu.py
。然后您已经有了一个包,可以从模块中导入
。用户导入HelloWorld
(或类似的内容)。只有可以找到
模块
的路径需要位于
PYTHONPATH
中。您可以尝试在只需要模块时导入模块(即在函数内部…)。可能不是最好的方法…Python的方法是在模块/脚本的开头有显式的导入,cf什么是“POV”和“cf”?我知道这不是pythonic,但对于程序员来说是一个常见的重复任务,作为程序员,我们希望避免这种事情,并关注真正重要的事情。我们使用的框架有很多常见的模式,比如控制器上的导入模型等等。Rails神奇地很好地解决了这个问题,说“不要这样做”是一个糟糕的回答。我通常做的是从导入具有短别名的模块,如
。将模型导入为m
。这解决了99%的案例。拥有一个好的导入器会很好。虽然有些人可能会愤怒,但有一些可能的解决方案是以工具为中心的。Eclipse非常好地处理java导入。这些似乎是更好的暗示imports@geckos阅读代码的频率比编写代码的频率要高得多,因此rails的“神奇”解决方案往往会让您在长期(找出某个类或函数的定义位置)上比正确设置环境浪费更多的时间(这样您就不必处理
sys.path
)以及编写几个显式导入。我的经验是,能够快速调试比节省几秒钟和每隔一段时间击键要重要得多……我从来没有遇到过在rails上定义某些内容的问题,一旦获得了约定,一切都正常工作。我有一些问题,因为我键入了一个类名而找不到。我同意你的观点,调试时间比节省打字要重要得多,但这仍然是件好事。没有魔法,一切都遵循严格且可预测的规则运行。PHP的autoloader与重新加载源代码无关。它是关于自动包含其他PHP文件的。
import os
import sys

root = os.path.dirname(__file__)
sys.path.append(root + "/modules")
sys.path.append(root + "/modules/User")
sys.path.append(root + "/modules/Article")

# IMPORTS MODULES
import hello
import HelloWorld

from HelloWorld import HelloWorld

# This is our application object. It could have any name,
# except when using mod_wsgi where it must be "application"
def application(environ, start_response):