在distutils中重命名脚本文件

26 投票
3 回答
5360 浏览
提问于 2025-04-16 08:04

我有一个Python脚本,叫做myscript.py,我想用distutils来安装它:

from distutils.core import setup
setup(..., scripts=['myscript.py'], ...)

我希望能用简单的myscript来调用这个安装好的脚本,而不是每次都要输入myscript.py。虽然我可以把文件重命名为myscript,但这样很多编辑器就不再知道这是一个Python文件了。

有没有办法可以保持原来的名字myscript.py,同时又能把文件安装成myscript呢?

3 个回答

6

这是我目前找到的最简单的解决方案。MFrecks 的回答在创建源代码分发或者执行其他命令时会出现问题,比如安装以外的命令。

import distutils.command.install_scripts
import shutil

class my_install(distutils.command.install_scripts.install_scripts):
    def run(self):
        distutils.command.install_scripts.install_scripts.run(self)
        for script in self.get_outputs():
            if script.endswith(".py"):
                shutil.move(script, script[:-3])

setup(..., cmdclass = {"install_scripts": my_install}, ...)
11

你可以在 setup.py 里做一些类似这样的事情:

import os
import shutil

if not os.path.exists('scripts'):
    os.makedirs('scripts')
shutil.copyfile('myscript.py', 'scripts/myscript')

setup(...
    scripts=['scripts/myscript'],
    ...
)
14

你可能想了解一下setuptools,它可以自动为你处理这些事情;具体可以参考这个链接:http://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation

使用distutils来打包和安装脚本可能会有点麻烦。首先,脚本的文件名在Windows和POSIX平台上很难统一。其次,你通常需要为“主”脚本单独创建一个文件,而你的实际“主”可能只是某个模块里的一个函数。而且即使在Python 2.4中,使用-m选项也只适用于那些没有安装在包里的.py文件。

setuptools解决了这些问题,它会自动为你生成带有正确扩展名的脚本,在Windows上,它甚至会创建一个.exe文件,这样用户就不需要更改他们的PATHEXT设置。使用这个功能的方法是在你的设置脚本中定义“入口点”,这些入口点指明生成的脚本应该导入并运行哪个函数。例如,如果你想创建两个控制台脚本,叫做foo和bar,还有一个图形界面脚本叫baz,你可以这样做:

setup(
    # other arguments here...
    entry_points={
        'console_scripts': [
            'foo = my_package.some_module:main_func',
            'bar = other_module:some_func',
        ],
        'gui_scripts': [
            'baz = my_package_gui:start_func',
        ]
    }
)

撰写回答