在distutils中重命名脚本文件
我有一个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',
]
}
)