使用`setup.py`安装包后运行`chmod`
假设我有一个包,这个包的代码里会调用一个可执行文件(比如一个第三方的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/ 目录下)。
安装后,如何对包内的文件执行某些操作呢?
这个问题似乎也在讨论同样的情况,看起来有一个合理的答案。