不带 .py 扩展名分发 Python 脚本

7 投票
3 回答
2782 浏览
提问于 2025-04-17 14:09

如果我在用Python写一个要发布的包,并且我把一些脚本放在setup.py里的scripts部分,是否有标准的方法让它们不带*.py的后缀?只要把文件名改成没有.py后缀就可以了吗,还是需要做其他的事情?把文件名中的.py去掉会不会影响到像setup.py或distutils这些Python工具的功能?谢谢。

3 个回答

0

如果这个脚本是打算在命令行中运行的,那么 .py 这个后缀其实并没有什么特别的作用。脚本会在以下两种情况下被 Python 解释器执行:

  1. 你在命令行中明确地告诉它这样做:$ python 你的脚本名
  2. 你在脚本的最上面加了一个特殊的标记(叫做 shebang),指向 Python。推荐的写法是 #!/usr/bin/env python

只要在每个脚本中加上这个特殊标记,你就可以随便给文件起名字。

如果不做这两件事,脚本就会被当作普通的脚本来执行,具体执行方式取决于你使用的命令行环境。

2

.py这个后缀只有在你想要导入模型的时候才需要用到。记住,像pipeasy_install这些其实都是在最上面有一个特殊标记的可执行文件。只有Windows这个操作系统是依赖文件后缀来判断如何执行文件的。

1

如果你需要让你的程序在Windows上运行,那么就不要去掉 .py 这个后缀,或者你可以使用setuptools的 entry_points 选项,这样可以自动生成适合你系统的脚本文件。例如,如果你想把 pip.main() 函数当作一个脚本来安装,pipsetup.py 文件中会这样指定:

  entry_points=dict(console_scripts=['pip=pip:main', 
          'pip-%s=pip:main' % sys.version[:3]]),

即使你不需要Windows兼容性,使用 entry_points 也是有道理的,因为它会为你生成正确的开头行,这样就能指向特定的Python解释器(而像 #! /usr/bin/env python 这样的通用写法可能就不对了)。

撰写回答