我有个类封装在了b模块里 他需要读这个目录下的配置文件b.cfg 单独使用很正常 然后我用a调用了这个b模块下的这个类 但是就发现读不到这个文件了 貌似就是因为工作目录换了 而且import也无法导入这个模块里面的文件了 这该怎么弄啊……
话说为什么写了这么久python,以前没遇到这问题啊……
对了,sys.path.append那个我试了,不是这个问题,是工作目录的问题……吧……
1
kaychen 2015-06-19 21:40:04 +08:00 via Android
目录下有__init__.py么?
|
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 配置文件目录)。 |
5
tdifg OP @lilydjwg 其实我遇到的是这样的:
我写了一个从各种搜索引擎爬取结果的库,他需要从配置文件读取各个搜索引擎的配置(比如百度如何解析url,如何翻页) 然后又因为支持用户自己解析页面(默认是xpath,但是很多情况不好做,所以支持自定义),也就是动态导入用户自己的库,所以会有__import__(xxx).geturlinpage类似的语句 写完之后扔到个search的模块里,在外面调用下,就发现工作目录变了的问题…… |
7
tdifg OP @lilydjwg 恩,但我还是用了:
import os,sys sys.path.append(os.path.basepath(__file__)) 大致是这意思,这样还挺方便 不过很多模块都要这个操作,感觉可以考虑写个导入处理模块,每个模块都引用下这个东西 |