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

时间:2009-05-19 08:50:15

标签: python debian

在我开发的Python系统中,我们通常有这个模块结构。

mymodule/
mymodule/mymodule/feature.py
mymodule/test/feature.py

这使我们的小测试框架可以轻松导入test / feature.py并运行单元测试。但是,我们现在需要一些shell脚本(用Python编写):

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 个答案:

答案 0 :(得分:9)

imp module用于此:

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$ 

答案 1 :(得分:1)

查看imp模块:

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

这将允许您按文件名加载模块。但我认为你的符号链接是一个更优雅的解决方案。

答案 2 :(得分:1)

你很可能通过使用导入hooks来使用一些转发器,但我不推荐它。另一方面,我也可能会以相反的方式执行此操作,将.py脚本放在某处,并为.py文件创建“.py”无符号链接。所以你的库可以在任何地方你可以从内部运行测试,通过导入它normall(因为它有py扩展名),然后/ usr / bin / yetanotherfeature指向它,所以你可以在没有py的情况下运行它。

编辑:没关系(至少是钩子部分),导入imp解决方案看起来对我很好:))

答案 3 :(得分:0)

另一种选择是使用setuptools:

  

“...没有简单的方法让脚本的文件名与Windows和POSIX平台上的本地约定相匹配。另一方面,你经常需要为”主“脚本创建一个单独的文件,当你的实际”主“ “是某个模块中的一个函数... setuptools通过使用正确的扩展名为您自动生成脚本来修复所有这些问题,而在Windows上它甚至会创建一个.exe文件......”

https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation