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

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

  •  
  •   tdifg · 2015-06-19 19:57:22 +08:00 · 2633 次点击
    这是一个创建于 3447 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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