Python导入:如何导入没有.py扩展名的模块?
在我开发的一个Python系统中,我们通常有这样的模块结构。
mymodule/
mymodule/mymodule/feature.py
mymodule/test/feature.py
这样一来,我们的小测试框架就可以轻松地导入test/feature.py并运行单元测试。不过,现在我们需要一些用Python写的shell脚本:
mymodule/
mymodule/scripts/yetanotherfeature.py
mymodule/test/yetanotherfeature.py
yetanotherfeature.py这个文件是通过Debian包安装到/usr/bin目录下的。但我们显然不想在那儿看到.py这个扩展名。所以,为了让测试框架仍然能够导入这个模块,我必须做一个符号链接的操作:
mymodule/
mymodule/scripts/yetanotherfeature
mymodule/scripts/yetanotherfeature.py @ -> mymodule/scripts/yetanotherfeature
mymodule/test/yetanotherfeature.py
在Python中,是否可以通过文件名导入模块,或者你能想到更优雅的解决方案吗?
4 个回答
1
9
imp模块就是用来做这个的:
daniel@purplehaze:/tmp/test$ cat mymodule
print "woho!"
daniel@purplehaze:/tmp/test$ cat test.py
import imp
imp.load_source("apanapansson", "mymodule")
daniel@purplehaze:/tmp/test$ python test.py
woho!
daniel@purplehaze:/tmp/test$
2
你可以尝试用一些小技巧,比如使用导入的钩子,不过我不太推荐这样做。另一方面,我可能会选择另一种方法,把你的.py脚本放在某个地方,然后创建没有.py后缀的符号链接指向这些.py文件。这样你的库可以放在任何地方,你可以通过正常导入来运行测试(因为它有.py后缀),然后/usr/bin/yetanotherfeature指向它,这样你就可以在不加.py的情况下运行它。
补充:别管这个(至少是钩子那部分),我觉得导入imp的解决方案看起来很好 :)