python import 会多次导入相同的包吗?

2015-04-21 10:02:26 +08:00
 zerh925

main.py

import moduleA
import matplotlib

if __name__ == "main":
    # do something with both library

moduleA.py

import matplotlib

if __name__ == "main":
    # do something with matplotlib

1.上面的情况会造成matplotlib包导入两次,花费两次的时间吗?
2.我记得每个python interpreter只会导入一次同一个包,如果这个成立,那如果main使用多进程调用moduleA的话呢?

4194 次点击
所在节点    问与答
8 条回复
seki
2015-04-21 10:26:21 +08:00
VYSE
2015-04-21 10:44:46 +08:00
一次,所以才能monkey patch
washinriver
2015-04-21 10:46:45 +08:00
不管在哪里导入,只会存在一份包, 在sys.modules下可以看到.
julyclyde
2015-04-21 13:33:17 +08:00
@VYSE 求教monkey patch的具体做法
VYSE
2015-04-21 17:37:01 +08:00
@julyclyde
import my_socket as socket
以后的import socket都是你的my_socket了
washinriver
2015-04-21 17:50:57 +08:00
@julyclyde gevent实现了一个socket, patch的结果就是拿自己的socket替代了python builtin的socket
messense
2015-04-21 18:06:31 +08:00
@VYSE 你说的有问题........

In [1]: import sys

In [2]: import gevent.socket as socket

In [3]: socket
Out[3]: <module 'gevent.socket' from '/home/hongyu/refactor/lib/python2.6/site-packages/gevent/socket.pyc'>

In [4]: import socket

In [5]: socket
Out[5]: <module 'socket' from '/usr/lib64/python2.6/socket.pyc'>

monkey patch 不是这样的,而是类似:

import urllib


def my_urlencode(query, doseq=0):
----pass

urllib.urlencode = my_urlencode

In[6]: urllib.urlencode

Out[6]: <function __main__.my_urlencode>
VYSE
2015-04-21 18:51:37 +08:00
@messense @julyclyde
好吧误人子弟了,不同module path,第二次import会覆盖掉前面。
monkey_patch是指拷贝自己module的attr到import后的target module下的所有attr。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/185139

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX