Rob Agar
Rob Agar

Reputation: 12459

Can Python setuptools install files outside dist-packages?

Is it actually possible to install data files from a sdist to arbitrary locations outside the sys.prefix directory using setuptools?

The documentation implies that it is possible to do so, using an absolute path in the data_files directory part, but in practice the leading slash seems to be ignored.

For instance with data_files=[('/opt/foo/bar', [...])], the files should be installed into the directory /opt/foo/bar. But they all end up in /usr/local/lib/python3.4/dist-packages/opt/foo/bar, which is no use to man nor beast.

I suspect that it used to work - has it been changed/broken recently?

(Using pip 8.1.1, Python 3.4, setuptools 20.9.0)

Upvotes: 4

Views: 848

Answers (2)

Rob Agar
Rob Agar

Reputation: 12459

Ah, it's all pip's fault. Given a sdist, pip helpfully creates a wheel before installing that. But wheels can't install files outside dist-packages.

Luckily you can knock some sense into pip by chucking an error, causing it to fall back to installing the sdist you wanted in the first place.

# in setup.py
if 'bdist_wheel' in sys.argv:
    raise RuntimeError("This setup.py does not support wheels") 

(Thanks to Benjamin Bach)

Upvotes: 1

estobbart
estobbart

Reputation: 1145

Best bet would be to override install with your own cmdclass and move the files yourself.

Upvotes: 1

Related Questions