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

Python导入:导入没有.py扩展名的模块?,python,debian,Python,Debian,在我为之开发的Python系统中,我们通常有这个模块结构 mymodule/ mymodule/mymodule/feature.py mymodule/test/feature.py 这允许我们的小测试框架轻松导入test/feature.py并运行单元测试。但是,我们现在需要一些shell脚本(用Python编写): yetanotherfeature.py由模块Debian包安装到/usr/bin中。但是我们显然不想在那里使用.py扩展。因此,为了使测试框架仍然能够导入模块,我必须进行以

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

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

yetanotherfeature.py由模块Debian包安装到/usr/bin中。但是我们显然不想在那里使用.py扩展。因此,为了使测试框架仍然能够导入模块,我必须进行以下符号链接:

mymodule/
mymodule/scripts/yetanotherfeature
mymodule/scripts/yetanotherfeature.py @ -> mymodule/scripts/yetanotherfeature
mymodule/test/yetanotherfeature.py
是否可以在Python中按文件名导入模块,或者您是否可以想出一个更优雅的解决方案?

查看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$ 

你很可能会通过使用import来使用一些技巧,不过我不推荐这样做。另一方面,我可能也会采用另一种方式,将.py脚本放在某个地方,并创建指向.py文件的“.py”符号链接。因此,您的库可以在任何地方,您可以通过导入它normall(因为它有py扩展名)从内部运行测试,然后/usr/bin/yetanotherfeature指向它,这样您就可以在不使用py的情况下运行它


编辑:尽管如此(至少是钩子部分),导入imp解决方案在我看来非常好:)

另一个选项是使用setuptools:

“…要使脚本的文件名与Windows和POSIX平台上的本地约定相匹配并不容易。另一方面,当实际的“主”脚本是某个模块中的函数…setuptools通过自动为您生成具有正确扩展名的脚本修复了所有这些问题,在Windows上它甚至会创建一个.exe文件


事实上,我认为这可能是最有意义的。当前的设计感觉有点缺陷:)符号链接有什么问题?这是最优雅的处理方式;您还应该将其用于部署/usr/bin/feature是指向/usr/bin/feature.py的链接,通过明确实现,它可以很好地工作。它应该是.pyc,但是由于原始文件的结尾不是.py,所以它只是在结尾加了一个c。看起来很奇怪。我可以让它不这样做吗?如果您不想创建“mymodulec”,请设置
sys.dont\u write\u bytecode=True
注意imp.load\u源代码已经过时,但仍在python 2.7中。有关python 3.3,请参见。有关名称参数(此处为“apanapansson”)的更多说明,请参阅。
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$