为什么python不会在启动时自动导入每个模块?

时间:2014-01-08 21:46:57

标签: python python-2.7 module python-import

我正在玩Python 2.7并且每个人都知道在每个程序的开头,你总是需要导入模块。例如:

import random
import time

for x in range(1, 300):
     print random.randint(1,100)
     time.sleep(1)
print "Done!"

无论如何,我在想,为什么我必须手动导入我的所有模块?为什么Python不会像这样导入它们。

当然,我可以理解为什么它不会像这样导入:

from random import randint
from time import *

for x in range(1, 300):
     print randint(1,100)
     sleep(1)
print "Done!"

由于某些功能名称可能会发生冲突。但是,如果您必须在开始时定义函数的位置,例如random.中的random.randint(1,100)

现代计算机如此强大,自动导入每个模块而不是浪费代码行似乎合乎逻辑,而且必须找到您需要的模块然后手动导入它时可以轻松实现自动化。 那么,为什么python不会在启动时自动导入每个模块? 编辑1: (删除) 编辑2: 我已经制作了一个小程序的新版本,它可以通过运行来导入我找到的每个模块:

 import sys
 sys.builtin_module_names

这是我的程序的第2版。不幸的是它没有每个模块(还有!)

 x = int(1000000)
def test():
    global x
    x -= 1
    print "Iterations Left: ", x
    import __builtin__
    import __main__
    import _ast
    import _bisect
    import _codecs
    import _codecs_cn
    import _codecs_hk
    import _codecs_iso2022
    import _codecs_jp
    import _codecs_kr
    import _codecs_tw
    import _collections
    import _csv
    import _functools
    import _heapq
    import _hotshot
    import _io
    import _json
    import _locale
    import _lsprof
    import _md5
    import _multibytecodec
    import _random
    import _sha
    import _sha256
    import _sha512
    import _sre
    import _struct
    import _subprocess
    import _symtable
    import _warnings
    import _weakref
    import _winreg
    import array
    import audioop
    import binascii
    import cPickle
    import cStringIO
    import cmath
    import datetime
    import errno
    import exceptions
    import future_builtins
    import gc
    import imageop
    import imp
    import itertools
    import marshal
    import math
    import mmap
    import msvcrt
    import nt
    import operator
    import parser
    import signal
    import strop
    import sys
    import thread
    import time
    import xxsubtype
    import zipimport
    import zlib

def start():
    from timeit import Timer
    t = Timer("test()", "from __main__ import test")
    print t.timeit()

start()

这花了不到一秒钟,在任务管理器中,Python shell目前在Windows 8.1中使用24.5MB的RAM。 另外,我没有配备固态硬盘或任何东西的功能强大的计算机,我有一台大约4年的戴尔笔记本电脑!

4 个答案:

答案 0 :(得分:4)

因为你并不需要所有这些。如果您不需要,可以加载每个库。

修改 我将我的libs文件夹复制到测试目录,并通过向其添加__init__.py文件使其成为一个包。在这个文件中我添加了:

import os
import glob
__all__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(__file__)+"/*.py")]

我创建了一个包含以下内容的测试脚本:

from Lib import *
print('Hello')

当我尝试在shell中运行时,它所做的就是打印' Python的禅宗'由蒂姆·彼得斯(Tim Peters)在我的浏览器中打开this webcomic(我绝对没看到的两件事)并抛出以下错误:

Traceback (most recent call last):
  File "C:\Users\Hannah\Documents\dropBox\Python\test\test.py", line 1, in <module>
    from Lib import *
AttributeError: 'module' object has no attribute 'crypt'

在执行任何此操作之前需要花费大量时间,大约10-15秒

答案 1 :(得分:2)

您可能想要的是一种功能,可以自动导入脚本中使用的库,而无需在开头指定它们。我在互联网上发现了这个http://www.connellybarnes.com/code/autoimp/

您只需在脚本开头添加一个

from autoimp import *

所有其他模块都“懒洋洋地”加载,即首次使用时。

交互式shell中的示例:

>>> random.random()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'random' is not defined
>>> from autoimp import *
>>> random.random()
0.0679000238267422

来自文档:

要获得最终的懒惰,请将命令 "from autoimp import *" 放入PYTHONSTARTUP文件中。现在,您的交互式会话默认提供所有模块。

答案 2 :(得分:1)

导入的每个模块都需要时间导入。每次启动Python时导入每个内置模块都会在许多重要场景中导致性能下降,这些场景会频繁启动新的Python解释器。

答案 3 :(得分:0)

Python确实有一组始终被加载的模块,其调用__builtins__ :)。

Python的内置函数为您提供import语句,以便您通过更多模块扩展范围!但是正如其他帖子所说,决定您的脚本需要这些模块由您决定。 -我已经研究过__builtins__的变异,并向您保证,明确导入您需要的更好的选择。


((关于不使用from name import *从此处切入的大声疾呼))


由于大多数编写python最终都会打包并安装该编写的python,因此,这是我在著名的import中获得python 句柄的一组资源: