python 跨目录引用的问题 - V2EX
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
kingmo888
V2EX    Python

python 跨目录引用的问题

  •  
  •   kingmo888 2016-05-23 09:35:29 +08:00 5277 次点击
    这是一个创建于 3479 天前的主题,其中的信息可能已经有所发展或是发生改变。

    `--Scr

    |--test1.py

    |--folder1

    | --mod1.py

    |--folder2

    | --mod2.py

    请问在这种目录结构下, mod2 如何引用 mod1 的模块呢?

    第 1 条附言    2016-05-23 11:21:47 +08:00
    非常感谢,方法汇总:
    尽量让项目文件汇总到一起。
    如果实在没办法,就把路径加到 path 里。
    第 2 条附言    2016-05-23 16:32:05 +08:00
    感谢各位,问题已解决。
    17 条回复    2016-05-24 16:52:47 +08:00
    blond
        1
    blond  
       2016-05-23 09:40:14 +08:00
    首先,你的 folder1 下得有__init__.py 文件让其成为一个包
    然后
    import sys
    sys.path.append("..")

    from folder1.mod1 import *
    northisland
        2
    northisland  
       2016-05-23 09:46:38 +08:00
    你得保证 sys.modules 字典里能有对应库的键-值。

    用 sys.path.insert()可以操作 sys.modules
    当然也可以设置$PYTHONPATH 这种环境变量路径

    我知道的是这些
    kingmo888
        3
    kingmo888  
    OP
       2016-05-23 09:46:52 +08:00
    @blond 非常感谢。这种方法可行。
    我记得有根据路径引用的,好像记错了。
    比如在 mod2.py
    from .folder1.mod1 import *
    jixiangqd
        4
    jixiangqd  
       2016-05-23 10:14:59 +08:00
    根目录下也得有__init__.py (当然子目录下也得有)
    把根目录加到 sys.path (其实运行程序的时候根目录设置到$PYTHONPATH 变量就可以了)

    发布的时候自带 setup.py , requirements.txt

    这是比较正常的流程
    woodrat
        5
    woodrat  
       2016-05-23 10:21:16 +08:00
    没有 __init__.py 可以直接把你要 import 的文件所在的路径直接添加到 sys.path 中。
    loggerhead
        6
    loggerhead  
       2016-05-23 10:47:16 +08:00   1
    正好写了一篇文章 Python 的 import 机制: https://loggerhead.me/posts/python-de-import-ji-zhi.html
    希望对你有帮助 :D
    0xLeco
        7
    0xLeco  
       2016-05-23 10:53:54 +08:00
    @loggerhead 写的真棒,学习了,赞一个!
    ltttx
        8
    ltttx  
       2016-05-23 10:58:57 +08:00
    相对导入,或者绝对路径导入
    如果 mod1 和 mod2 都是你自己项目的内部模块,相对导入更好点。
    如果 mod1 和 mod2 需要分开单独发布,那么绝对导入更好点。
    GlobalNPC
        9
    GlobalNPC  
       2016-05-23 11:55:47 +08:00
    @loggerhead 手动点赞
    zjuhwc
        10
    zjuhwc  
       2016-05-23 12:50:50 +08:00
    一般遇到这种复杂的导入场景,我是把根目录放进 python 系统路径

    ```sh
    $ cd your-project-root-dir
    $ python -c 'import site; print site.getsitepackages()[0]'
    /usr/local/lib/python2.7/site-packages
    $ echo `pwd` > /usr/local/lib/python2.7/site-packages/my-project-name.pth
    # 使用以下命令查看当前目录是否在输出中
    $ python -c 'import sys; print sys.path'
    ```

    再把你每个有需要导入文件的文件夹加入 __init__.py 文件变成包,然后就可以用相对于项目的路径导入了:

    ```
    import folder1.mod1
    from folder2 import mod2
    ```
    loggerhead
        12
    loggerhead  
       2016-05-23 14:17:35 +08:00
    @kethylar @infun 哈哈,谢谢~
    Allianzcortex
        14
    Allianzcortex  
       2016-05-23 16:09:27 +08:00
    requests 源代码里的解决方法是在 __init__.py 里引入~
    quietin
        15
    quietin  
       2016-05-23 18:35:06 +08:00
    Python -m
    xuelang
        16
    xuelang  
       2016-05-24 09:36:54 +08:00
    jinxueliu
        17
    jinxueliu  
       2016-05-24 16:52:47 +08:00
    |--folder1

    | --mod1.py
    | --__init__.py (空白文档)

    |--folder2
    | --mod2.py

    在 folder1 加入 __init__.py 文件

    mod2.py 如下:

    import sys
    sys.insert('..')
    from foder1 import mod1
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4291 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 04:06 PVG 12:06 LAX 20:06 JFK 23:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86