V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zerh925
V2EX  ›  问与答

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

  •  
  •   zerh925 · 2015-04-21 10:02:26 +08:00 · 4297 次点击
    这是一个创建于 3508 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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的话呢?

    8 条回复    2015-04-21 18:51:37 +08:00
    VYSE
        2
    VYSE  
       2015-04-21 10:44:46 +08:00 via Android
    一次,所以才能monkey patch
    washinriver
        3
    washinriver  
       2015-04-21 10:46:45 +08:00
    不管在哪里导入,只会存在一份包, 在sys.modules下可以看到.
    julyclyde
        4
    julyclyde  
       2015-04-21 13:33:17 +08:00
    @VYSE 求教monkey patch的具体做法
    VYSE
        5
    VYSE  
       2015-04-21 17:37:01 +08:00   ❤️ 1
    @julyclyde
    import my_socket as socket
    以后的import socket都是你的my_socket了
    washinriver
        6
    washinriver  
       2015-04-21 17:50:57 +08:00
    @julyclyde gevent实现了一个socket, patch的结果就是拿自己的socket替代了python builtin的socket
    messense
        7
    messense  
       2015-04-21 18:06:31 +08:00   ❤️ 1
    @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
        8
    VYSE  
       2015-04-21 18:51:37 +08:00   ❤️ 1
    @messense @julyclyde
    好吧误人子弟了,不同module path,第二次import会覆盖掉前面。
    monkey_patch是指拷贝自己module的attr到import后的target module下的所有attr。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5837 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:06 · PVG 14:06 · LAX 22:06 · JFK 01:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.