推荐学习书目
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
tdifg
V2EX  ›  Python

Python 导入子目录下模块遇到的问题

  •  
  •   tdifg · Jun 19, 2015 · 3070 views
    This topic created in 4017 days ago, the information mentioned may be changed or developed.

    我有个类封装在了b模块里 他需要读这个目录下的配置文件b.cfg 单独使用很正常 然后我用a调用了这个b模块下的这个类 但是就发现读不到这个文件了 貌似就是因为工作目录换了 而且import也无法导入这个模块里面的文件了 这该怎么弄啊……
    话说为什么写了这么久python,以前没遇到这问题啊……
    对了,sys.path.append那个我试了,不是这个问题,是工作目录的问题……吧……

    8 replies    2015-06-21 23:20:52 +08:00
    kaychen
        1
    kaychen  
       Jun 19, 2015 via Android
    目录下有__init__.py么?
    lilydjwg
        2
    lilydjwg  
       Jun 19, 2015
    竟然才遇到这种问题,难怪 MySQL 那堆脚本一直那个拙样没人修理一下。

    这种情况,你需要在运行时来找到自己,然后找到配置文件。Python 下找自己很容易,__file__ 就是了。你对它取绝对路径,然后取父目录,再与你的配置文件相连接就可以了。

    处理配置文件的另一种(更好的)方案是,通过选项来指定配置文件的位置。如果不指定,那么读取默认配置文件,比如 /etc/app.conf(系统级配置)或者 ~/.app.conf(用户级配置)或者 ~/.config/appname/app.conf(用户级配置,XDG 标准默认位置;你需要 xdg 包来取得有效的 XDG 配置文件目录)。
    tdifg
        3
    tdifg  
    OP
       Jun 19, 2015
    @lilydjwg 的确。
    MySQL脚本指的什么啊?
    lilydjwg
        4
    lilydjwg  
       Jun 19, 2015
    @tdifg MySQL scripts 目录下用于初始化数据库之类的脚本,必须在特定的目录下运行。
    tdifg
        5
    tdifg  
    OP
       Jun 19, 2015
    @lilydjwg 其实我遇到的是这样的:
    我写了一个从各种搜索引擎爬取结果的库,他需要从配置文件读取各个搜索引擎的配置(比如百度如何解析url,如何翻页)
    然后又因为支持用户自己解析页面(默认是xpath,但是很多情况不好做,所以支持自定义),也就是动态导入用户自己的库,所以会有__import__(xxx).geturlinpage类似的语句
    写完之后扔到个search的模块里,在外面调用下,就发现工作目录变了的问题……
    lilydjwg
        6
    lilydjwg  
       Jun 19, 2015
    @tdifg 动态导入可以考虑 importlib 模块,可以指定文件,不需要修改 sys.path。
    tdifg
        7
    tdifg  
    OP
       Jun 21, 2015
    @lilydjwg 恩,但我还是用了:
    import os,sys
    sys.path.append(os.path.basepath(__file__))
    大致是这意思,这样还挺方便
    不过很多模块都要这个操作,感觉可以考虑写个导入处理模块,每个模块都引用下这个东西
    lilydjwg
        8
    lilydjwg  
       Jun 21, 2015   ❤️ 1
    @tdifg 这说明你没有把模块安装到默认目录,也没有其它管理手段啦。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2591 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:40 · PVG 17:40 · LAX 02:40 · JFK 05:40
    ♥ Do have faith in what you're doing.