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

如何在 python 项目中引用自己的一个包

  •  
  •   KyL · 2015-02-10 17:39:48 +08:00 · 16203 次点击
    这是一个创建于 3579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有一个项目,下面有两个子项目01和02。这两个项目要共享一部分代码,因此我把共用的代码抽出来写成一个包。整个项目的目录结构像是这样的

    /my_proj
        /sub_proj01
            proj_file01.py
        /sub_proj02
            proj_file02.py
        /my_package
            __init__.py
            module01.py
            module02.py
    

    我如何在proj_file01.pyproj_file02.py中通过类似

    import my_package.module01
    from my_package.module02 import *
    

    来引用module01.pymodule02.py里面的功能呢?往sys.path里面加路径?,感觉不太对啊。而且my_package也在开发中,所以不能把它分离出来放到python的default path里面。
    有其他更合理的方案吗?谢谢大家了。

    15 条回复    2015-02-14 20:09:09 +08:00
    lianghui
        1
    lianghui  
       2015-02-10 17:43:14 +08:00
    为项目建立setup文件, 然后 python setup.py develop 就是使用开发模式安装到本路径。
    9hills
        2
    9hills  
       2015-02-10 17:44:48 +08:00
    设置环境变量 PYTHONPATH

    如果因为不想全局应用,可以试试这个东西
    https://github.com/kennethreitz/autoenv

    对某个dir单独设置env,cd进去的时候自动应用。。
    rikeinei
        3
    rikeinei  
       2015-02-10 18:06:38 +08:00
    import ..my_package.module01
    KyL
        4
    KyL  
    OP
       2015-02-10 18:18:39 +08:00
    @rikeinei 我试了试,报错。ValueError: Attempted relative import in non-package
    tabris17
        5
    tabris17  
       2015-02-10 18:21:13 +08:00
    setuptools
    endoffight
        6
    endoffight  
       2015-02-10 18:28:26 +08:00 via Android
    可以通过拓展sys.path,将包的路径加入即可!
    invite
        7
    invite  
       2015-02-10 18:58:06 +08:00
    site-packages 下面放个 .pth 文件好像可以。
    kaneg
        8
    kaneg  
       2015-02-10 20:10:32 +08:00 via iPhone
    如果用pycharm,直接把各个项目根目录设置为source即可
    binux
        9
    binux  
       2015-02-10 20:17:48 +08:00   ❤️ 1
    你这样组织目录是不对的,你只是把 sub_proj01 放到了 my_proj 目录下面,而不是 my_proj.sub_proj01
    sub_proj01 和 my_package 没有任何关联

    如果你不想 install my_package 到 site-package 的话,你需要将 my_proj 变成模块,然后 sub_proj01 就能用 import my_proj.my_package 了
    ryanking8215
        10
    ryanking8215  
       2015-02-10 21:25:32 +08:00
    使用相对导入:
    例如是proj_file01.py文件,则from .. import mypackage or from ..mypackage import module01,看你需要了。
    相对导入有缺点,if __name__=='__main__': 不支持相对导入;执行需要通过python -m xxx, 而且要在合适的目录下,否则会报找不到‘top level'的package.
    ligyxy
        11
    ligyxy  
       2015-02-11 03:00:05 +08:00
    @kaneg 愿闻其详
    KyL
        12
    KyL  
    OP
       2015-02-11 12:52:06 +08:00
    @ryanking8215 请问相对导入PY2中有这个功能吗?我得到错误: from .. import pkgs
    ValueError: Attempted relative import in non-package
    Sylv
        13
    Sylv  
       2015-02-11 13:33:29 +08:00 via iPhone
    应该是你要先把你的项目变成 package,在目录里加入 __init__.py 文件
    rikeinei
        14
    rikeinei  
       2015-02-13 12:17:41 +08:00
    @KyL
    Python 的模块包,如果是放在文件夹中,则需要在目录里加入 __init__.py 文件
    如果只是一个文件,import sys sys.path.append(文件的绝对路径)
    当前强烈不推荐下面的。
    kaneg
        15
    kaneg  
       2015-02-14 20:09:09 +08:00 via iPhone
    @ligyxy 你用下pycharm就知道了,在需要设置为项目代码根目录的目录上点右键,里面有设置为source的选项,这样运行的时候这个目录就自动加入到path了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:10 · PVG 05:10 · LAX 13:10 · JFK 16:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.