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
lyricorpse
V2EX  ›  Python

请教 Python 从 egg 中 import .so 文件的正确姿势

  •  
  •   lyricorpse · 2017-06-22 12:32:39 +08:00 · 6000 次点击
    这是一个创建于 2719 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我写了一个包,用

    python setup.py install
    

    安装后会在site-package目录下得到一个.egg 的文件,然后可以在 python 中 import 这个包。 问题是,我在setup.py文件中包含了 package_data,是一个名为xxx.so的动态库文件,这个库文件在 install 之后也被正确包含进那个.egg 文件里了(把.egg 重命名成.zip 解压后可以确认)。 但是,如果只用这个.egg 文件,那么包里的一行代码

    from . import xxx
    

    就会报错

    ImportError: cannot import name 'xxx'
    

    奇怪的是,如果我重命名.zip 然后解压成文件夹,from . import xxx 就能正常加载那个动态库了。

    请问熟悉 Python 的 V 友这种情况该如何解决?谢谢!

    4 条回复    2017-06-23 00:57:28 +08:00
    lyricorpse
        1
    lyricorpse  
    OP
       2017-06-22 12:44:17 +08:00
    我后来在`setup.py`中的`setup()`中加入了一条`zip_safe=False`来生成 folder 而不是 egg,解决了问题,但不知道有没有更优雅的解决方案?
    BiggerLonger
        2
    BiggerLonger  
       2017-06-22 14:40:15 +08:00   ❤️ 1
    import sys
    import os
    sys.path.append(os.path.abspath('xxx.egg')) ?
    ldbC5uTBj11yaeh5
        3
    ldbC5uTBj11yaeh5  
       2017-06-22 14:48:18 +08:00 via Android   ❤️ 1
    用 zipimport 引用这 so
    lyricorpse
        4
    lyricorpse  
    OP
       2017-06-23 00:57:28 +08:00
    @BiggerLonger @jigloo 谢谢两位!不过如果通过 pip 安装,是默认生成 folder 的,并且 path 会有所变化,所以似乎 path.append 和 zipimport 都不能同时适用两种安装方式?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2585 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:34 · PVG 13:34 · LAX 21:34 · JFK 00:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.