我有一个python脚本myscript.py,我希望使用distutils安装:
from distutils.core import setup
setup(..., scripts=['myscript.py'], ...)
如果我只使用myscript
而不是键入myscript.py
来调用已安装的脚本,我更愿意。这可以通过将文件重命名为myscript
来实现,但随后许多编辑人员将不再理解它是Python文件。
是否有某种方法可以保留旧名称myscript.py
,但仍将文件安装为myscript
?
答案 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}, ...)