我正在玩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年的戴尔笔记本电脑!
答案 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 句柄的一组资源:
pdb
(import pdb; pdb.set_trace()
,> pp variable
)print(help(variable))
,dir(variable)
,pprint.pprint( variable.__dict__ )