Python导入:如何导入没有.py扩展名的模块?

4 投票
4 回答
4320 浏览
提问于 2025-04-15 11:41

在我开发的一个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

看看这个 imp 模块:

http://docs.python.org/library/imp.html

这个模块可以让你通过文件名来加载一个模块。不过,我觉得你使用符号链接的方式更优雅一些。

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的解决方案看起来很好 :)

撰写回答