使用`setup.py`安装包后运行`chmod`

5 投票
1 回答
1328 浏览
提问于 2025-04-17 05:47

假设我有一个包,这个包的代码里会调用一个可执行文件(比如一个第三方的C或Java程序)。再假设这个应用程序足够小,可以和这个包一起打包。比如说,只有一个可执行文件(cfoo)。

我可以这样组织文件结构:

.
|-- foo
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- core.py
|   |-- corebin
|   |   `-- cfoo
|   `-- foomain.py
`-- setup.py

然后准备一个 setup.py 文件,内容如下:

from setuptools import setup

setup(
    name='foo',
    version='1.0',
    packages=['foo'],
    scripts=['foo/foomain.py'],
    package_data={'foo': ['corebin/*']},
    zip_safe=False
)

这样我就可以正确安装这个包。之后,在包的代码里我可以这样做:

from subprocess import call

import pkg_resources as res

def main():
    fn = res.resource_filename('foo', 'corebin/cfoo')
    print "Resource located at:", fn
    call([fn])

不过,遗憾的是,这个可执行文件会被安装时没有设置可执行权限。即使原来的文件是有这个权限的。在 setup.py 脚本的最后加一个 chmod 的调用并不简单,因为需要先弄清楚正确的安装路径。我试过用 resource_filename,但它返回的是本地文件(也就是“安装前”的文件)。

这个问题该怎么解决呢?还有考虑到 virtualenv 的情况……

1 个回答

2

我把我的评论提升为一个回答:

如果你使用 scripts 这个关键词来安装它,它会正确设置模式(并且会安装到合适的 bin/ 目录下)。

安装后,如何对包内的文件执行某些操作呢?

这个问题似乎也在讨论同样的情况,看起来有一个合理的答案。

撰写回答