コードのどこかに実行可能ファイルを呼び出すパッケージがあるとしましょう(たとえば、サードパーティのc / java-program)。さらに、アプリケーションがパッケージにバンドルできるほど小さい/些細なものであると仮定しましょう。たとえば、単一の実行可能ファイル(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])
残念ながら、実行可能ファイルは実行可能フラグを設定せずにインストールされます。元のファイルに設定されていても。chmodスクリプトの最後に呼び出しを追加するのsetup.pyは簡単ではありません。最初に適切なインストールパスを把握する必要があるからです。試してみましresource_filenameたが、ローカルファイルが返されました(「プレインストール」のように)。
この問題はどのように解決できますか?またvirtualenv、念頭に置いて...