在distutils中重命名脚本文件

时间:2010-12-05 14:24:34

标签: python distutils

我有一个python脚本myscript.py,我希望使用distutils安装:

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

如果我只使用myscript而不是键入myscript.py来调用已安装的脚本,我更愿意。这可以通过将文件重命名为myscript来实现,但随后许多编辑人员将不再理解它是Python文件。

是否有某种方法可以保留旧名称myscript.py,但仍将文件安装为myscript

3 个答案:

答案 0 :(得分:12)

您可能希望查看为您自动执行此操作的setuptools;从 http://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation

  

打包和安装脚本可能有点尴尬   distutils的。首先,没有简单的方法来制作剧本   filename匹配Windows和POSIX平台上的本地约定。   另一方面,您经常需要为此创建一个单独的文件   “main”脚本,当你的实际“main”是模块中的一个函数时   某处。即使在Python 2.4中,使用-m选项也只适用于   未安装在软件包中的实际.py文件。

     

setuptools通过自动生成来修复所有这些问题   有正确扩展名的脚本,在Windows上它会   甚至创建一个.exe文件,以便用户不必更改它们   PATHEXT设置。使用此功能的方法是定义“条目   在您的设置脚本中指出生成的函数   脚本应该导入并运行。例如,要创建两个控制台   您可能会执行名为foo和bar的脚本以及名为baz的GUI脚本   像这样的东西:

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',
        ]
    }
)

答案 1 :(得分:10)

您可以随时执行此类操作(在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'],
    ...
)

答案 2 :(得分: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}, ...)