V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bicoff9527
V2EX  ›  Python

模块名与引入的包名相同的问题

  •  
  •   bicoff9527 · 2016-05-22 00:13:49 +08:00 · 4554 次点击
    这是一个创建于 3108 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我要写一个模块叫 string, 也就是 string.py
    并且要在这个文件里 import 标准库中的 string

    好像用 from __future__ import absolute_import 也没用?
    这个好像是从同一个包下, 区别引用标准库模块还是引用其它文件, 比如从 foo 中引用 string, 这样才可以区分

    不改名的情况下怎么解决?从 sys.path 里删掉当前路径?感觉不是很 pythonic
    这个方法试过了是可行的
    但是有没有更好的?
    第 1 条附言  ·  2016-05-22 14:21:09 +08:00

    找到的一个还行的办法

    import sys
    import imp
    
    exec_prefix = sys.exec_prefix
    python_ver = sys.version[:3]
    libpython = os.path.join(exec_prefix, "lib", "python"+python_ver)
    
    try:
        f, fname, mode = imp.find_module('string', [libpython])
        string = imp.load_module('string', f, fname, mode)
    except ImportError:
        pass
    
    13 条回复    2016-05-23 11:55:53 +08:00
    majik
        1
    majik  
       2016-05-22 00:54:45 +08:00 via iPhone
    把 string 弄成文件夹 在 __init__.py 里面写你的模块,这这里面可以 import string 。还有切记别把 string 这个模块放到你的项目根路径之下,我一般会把它放进 utils 模块里面。最后说一句,使用相同的名字去封装一个模块这做法是在不可苟同。
    somebody
        2
    somebody  
       2016-05-22 07:35:09 +08:00 via Android
    import string as origstring
    yangtukun1412
        3
    yangtukun1412  
       2016-05-22 09:24:01 +08:00 via Android
    relative import
    bicoff9527
        4
    bicoff9527  
    OP
       2016-05-22 09:38:02 +08:00
    @majik 这种做法确实不好, 但是命名时确实很容易和标准库, 特别是安装的第三方库, 出现这种情况
    yangtukun1412
        5
    yangtukun1412  
       2016-05-22 09:40:55 +08:00
    刚没看清楚问题,如果想从 string.py 中 import 标准库中的 string 库的话, 正常使用了 absolute import 的话应该是没问题的,出现你这种情况应该是因为你在同一目录下运行的程序,而 python 默认会把 cwd 加入到 sys.path 中的第一项。

    解决方法可以使用 pkgutil, 其中提供了根据指定的 path 来 import module 的方法.
    pimin
        6
    pimin  
       2016-05-22 09:43:56 +08:00   ❤️ 1
    majik
        7
    majik  
       2016-05-22 11:22:16 +08:00
    @bicoff9527 颗粒度都掌不好的库还是不要用了。。。 AHHH
    bicoff9527
        8
    bicoff9527  
    OP
       2016-05-22 11:30:46 +08:00
    @majik 和颗粒度有什么关系, 命名冲突本来就很常见
    ayaseangle
        9
    ayaseangle  
       2016-05-22 11:45:15 +08:00 via Android
    不作死就不会死。当前目录在 path 最前面。
    mornlight
        10
    mornlight  
       2016-05-22 11:51:05 +08:00
    不考虑把自己的模块换个名字吗,就算当前解决了问题将来也可能会让别人踩到坑。
    xiaket
        11
    xiaket  
       2016-05-22 16:04:48 +08:00 via iPad
    @bicoff9527 哪有那么容易重复?实在不行你往模块名前加一个公司 /组织名要够了啊?
    4everLoveU
        12
    4everLoveU  
       2016-05-23 11:32:48 +08:00
    有非得命令成 string.py 的难言之隐吗?
    julyclyde
        13
    julyclyde  
       2016-05-23 11:55:53 +08:00
    要是两个外部库相互冲突倒可以理解
    和标准库冲突,那一定是外部库的全责啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1710 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:47 · PVG 00:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.