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

2015-06-19 19:57:22 +08:00
 tdifg

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

2652 次点击
所在节点    Python
8 条回复
kaychen
2015-06-19 21:40:04 +08:00
目录下有__init__.py么?
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
2015-06-19 22:15:34 +08:00
@lilydjwg 的确。
MySQL脚本指的什么啊?
lilydjwg
2015-06-19 22:41:45 +08:00
@tdifg MySQL scripts 目录下用于初始化数据库之类的脚本,必须在特定的目录下运行。
tdifg
2015-06-19 22:46:28 +08:00
@lilydjwg 其实我遇到的是这样的:
我写了一个从各种搜索引擎爬取结果的库,他需要从配置文件读取各个搜索引擎的配置(比如百度如何解析url,如何翻页)
然后又因为支持用户自己解析页面(默认是xpath,但是很多情况不好做,所以支持自定义),也就是动态导入用户自己的库,所以会有__import__(xxx).geturlinpage类似的语句
写完之后扔到个search的模块里,在外面调用下,就发现工作目录变了的问题……
lilydjwg
2015-06-19 23:07:55 +08:00
@tdifg 动态导入可以考虑 importlib 模块,可以指定文件,不需要修改 sys.path。
tdifg
2015-06-21 22:18:24 +08:00
@lilydjwg 恩,但我还是用了:
import os,sys
sys.path.append(os.path.basepath(__file__))
大致是这意思,这样还挺方便
不过很多模块都要这个操作,感觉可以考虑写个导入处理模块,每个模块都引用下这个东西
lilydjwg
2015-06-21 23:20:52 +08:00
@tdifg 这说明你没有把模块安装到默认目录,也没有其它管理手段啦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/199899

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX