V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · May 22, 2016 · 5373 views
    This topic created in 3633 days ago, the information mentioned may be changed or developed.
    我要写一个模块叫 string, 也就是 string.py
    并且要在这个文件里 import 标准库中的 string

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

    不改名的情况下怎么解决?从 sys.path 里删掉当前路径?感觉不是很 pythonic
    这个方法试过了是可行的
    但是有没有更好的?
    Supplement 1  ·  May 22, 2016

    找到的一个还行的办法

    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 replies    2016-05-23 11:55:53 +08:00
    majik
        1
    majik  
       May 22, 2016 via iPhone
    把 string 弄成文件夹 在 __init__.py 里面写你的模块,这这里面可以 import string 。还有切记别把 string 这个模块放到你的项目根路径之下,我一般会把它放进 utils 模块里面。最后说一句,使用相同的名字去封装一个模块这做法是在不可苟同。
    somebody
        2
    somebody  
       May 22, 2016 via Android
    import string as origstring
    yangtukun1412
        3
    yangtukun1412  
       May 22, 2016 via Android
    relative import
    bicoff9527
        4
    bicoff9527  
    OP
       May 22, 2016
    @majik 这种做法确实不好, 但是命名时确实很容易和标准库, 特别是安装的第三方库, 出现这种情况
    yangtukun1412
        5
    yangtukun1412  
       May 22, 2016
    刚没看清楚问题,如果想从 string.py 中 import 标准库中的 string 库的话, 正常使用了 absolute import 的话应该是没问题的,出现你这种情况应该是因为你在同一目录下运行的程序,而 python 默认会把 cwd 加入到 sys.path 中的第一项。

    解决方法可以使用 pkgutil, 其中提供了根据指定的 path 来 import module 的方法.
    majik
        7
    majik  
       May 22, 2016
    @bicoff9527 颗粒度都掌不好的库还是不要用了。。。 AHHH
    bicoff9527
        8
    bicoff9527  
    OP
       May 22, 2016
    @majik 和颗粒度有什么关系, 命名冲突本来就很常见
    ayaseangle
        9
    ayaseangle  
       May 22, 2016 via Android
    不作死就不会死。当前目录在 path 最前面。
    mornlight
        10
    mornlight  
       May 22, 2016
    不考虑把自己的模块换个名字吗,就算当前解决了问题将来也可能会让别人踩到坑。
    xiaket
        11
    xiaket  
       May 22, 2016 via iPad
    @bicoff9527 哪有那么容易重复?实在不行你往模块名前加一个公司 /组织名要够了啊?
    4everLoveU
        12
    4everLoveU  
       May 23, 2016
    有非得命令成 string.py 的难言之隐吗?
    julyclyde
        13
    julyclyde  
       May 23, 2016
    要是两个外部库相互冲突倒可以理解
    和标准库冲突,那一定是外部库的全责啊
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2425 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 86ms · UTC 10:05 · PVG 18:05 · LAX 03:05 · JFK 06:05
    ♥ Do have faith in what you're doing.