如何使用Python Setuptools指定脚本的执行权限

nic*_*nic 6 python permissions scripting setuptools

我有一个我创建的Python包,我正在使用setuptools.setup()它来安装它.该程序包包含可执行脚本,使用scriptssetup()函数的参数.

我这样安装:

sudo python setup.py install
Run Code Online (Sandbox Code Playgroud)

安装后,可执行脚本位于/usr/local/bin.唯一的问题是权限是:

-rwxr-x---  1 root root   57 Aug 23 15:13 example_script*
Run Code Online (Sandbox Code Playgroud)

代替:

-rwxr-xr-x  1 root root   57 Aug 23 15:13 example_script*
Run Code Online (Sandbox Code Playgroud)

任何人都知道我如何指定输出可执行文件的权限或默认为什么不允许任何人执行?

供参考:我的umask是0027和许可/usr/local/bin/drwxr-xr-x(所有者=根组=根).所有可执行脚本都-rwxr-xr-x在开发区域中具有权限.

小智 8

这个问题现在有点老了,但我希望我的答案对于碰巧像我一样找到它的人都会有用.

我的包裹也遇到了同样的问题.显然,setuptools和pip(我的pip都没有1.5.6)显式处理权限.您可以选择手动更改权限,也可以从scripts参数迁移到entry_points.

1)手动更改文件权限

这很棘手且足够克服,但应该有效.我们的想法是,如果安装过程将您的可执行文件放入/usr/local/bin,它还有权限chmod文件以包含可执行标志.从setup.py,你以后setup()条款,运行是这样的:

execpath = '/usr/local/bin/yourexec'

if os.name is 'posix' and os.path.exists(execpath):
    os.chmod(execpath, int('755', 8))
Run Code Online (Sandbox Code Playgroud)

2)迁移到 entry_points

setuptools为您的setup()命名提供了一个选项entry_points.它接受与键的字典console_scriptsgui_scripts,您可以按如下方式使用:

setup(
    # Package name, version, author, links, classifiers, etc
    entry_points = {
        'console_scripts': [
            'myexecfile = mypackage.mymainmodule:mymainfunction'
        ]
    }
)
Run Code Online (Sandbox Code Playgroud)

本声明将自动生成myexecfile的可执行文件,要求mymainfunctionmymainmodulemypackage,这很容易被你分发包.

您应该知道的问题是入口点函数(mymainfunction在此示例中)可能没有任何参数.如果sys.argv从可执行文件作为参数传递给main函数,则应该重写函数以sys.argv自行检索和解析.

Chris Warrick在这个名为Python Apps The Right Way的功能上写了一篇很好的文章,你可能会发现它很有用.