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):