4

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

4 回答 4

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$ 
于 2009-05-19T08:55:32.477 回答
2

您很可能通过使用 import hooks来使用一些技巧,但我不推荐它。另一方面,我也可能会反过来做,把你的 .py 脚本放在某个地方,并制作指向 .py 文件的 '.py'less 符号链接。因此,您的库可以在任何地方,您可以通过正常导入它从内部运行测试(因为它具有 py 扩展名),然后 /usr/bin/yetanotherfeature 指向它,因此您可以在没有 py.

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

于 2009-05-19T08:59:37.427 回答
1

查看 imp 模块:

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

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

于 2009-05-19T08:53:46.003 回答
0

另一种选择是使用 setuptools:

“...在 Windows 和 POSIX 平台上,让脚本的文件名匹配本地约定并不容易。另一方面,当您的实际“主”是一个在某个模块中的某个地方运行... setuptools 通过自动为您生成具有正确扩展名的脚本来解决所有这些问题,并且在 Windows 上它甚至会创建一个 .exe 文件..."

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

于 2014-07-07T05:30:10.940 回答