For closure:  The solution was to make a Command class + implement finalize_options to fixup the paths in distribution.data_files.<div><br></div><div><br></div><div>Source:</div><div><br></div><div># <a href="https://gist.github.com/stuaxo/c76a042cb7aa6e77285b">https://gist.github.com/stuaxo/c76a042cb7aa6e77285b</a></div><div>"""</div><div>Install a file into the root of sitepackages on windows as well as linux.</div><div><br></div><div>Under normal operation on win32 path_to_site_packages</div><div>gets changed to '' which installs inside the .egg instead.</div><div>"""</div><div><br></div><div>import os</div><div><br></div><div>from distutils import sysconfig</div><div>from distutils.command.install_data import install_data</div><div>from setuptools import setup</div><div><br></div><div>here = os.path.normpath(os.path.abspath(os.path.dirname(__file__)))</div><div><br></div><div>site_packages_path = sysconfig.get_python_lib()</div><div>site_packages_files = ['TEST_FILE.TXT']</div><div><br></div><div>class _install_data(install_data):</div><div>    def finalize_options(self):</div><div>        """</div><div>        On win32 the files here are changed to '' which</div><div>        ends up inside the .egg, change this back to the</div><div>        absolute path.</div><div>        """</div><div>        install_data.finalize_options(self)</div><div>        global site_packages_files</div><div>        for i, f in enumerate(list(self.distribution.data_files)):</div><div>            if not isinstance(f, basestring):</div><div>                folder, files = f</div><div>                if files == site_packages_files:</div><div>                    # Replace with absolute path version</div><div>                    self.distribution.data_files[i] = (site_packages_path, files)</div><div><br></div><div>setup(</div><div>    cmdclass={'install_data': _install_data},</div><div>    name='test_install',</div><div>    version='0.0.1',</div><div><br></div><div>    description='',</div><div>    long_description='',</div><div>    url='<a href="https://example.com">https://example.com</a>',</div><div>    author='Stuart Axon',</div><div>    author_email='stuaxo2@yahoo.com',</div><div>    license='PD',</div><div>    classifiers=[],</div><div>    keywords='',</div><div>    packages=[],</div><div><br></div><div>    install_requires=[],</div><div><br></div><div>    data_files=[</div><div>        (site_packages_path, site_packages_files),</div><div>    ],</div><div><br></div><div>)</div><div><br></div><div><br><br>On Tue, 10 Mar, 2015 at 11:29 PM, Stuart Axon <stuaxo2@yahoo.com> wrote:<br>
<blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;">I had more of a dig into this, with a minimal setup.py:


<a href="https://gist.github.com/stuaxo/c76a042cb7aa6e77285b">https://gist.github.com/stuaxo/c76a042cb7aa6e77285b</a>

setup calls install_data

On win32 setup.py calls install_data which copies the file into the egg - even though I have given the absolute path to sitepackages


C:\> python setup.py install
....

running install_data
creating build\bdist.win32\egg
copying TEST_FILE.TXT -> build\bdist.win32\egg\ 
....



On Linux the file is copied to the right path:


$ python setup.py install
.....

installing package data to build/bdist.linux-x86_64/egg
running install_data
copying TEST_FILE.TXT -> /mnt/data/home/stu/.virtualenvs/tmpv/lib/python2.7/site-packages
....



*something* is normalising my absolute path to site packages into just '' - it's possible to see by looking at self.data_files in the 'run' function in:


distutils/command/install_data.py

-  on windows it the first part has been changed to '' unlike on linux where it's the absolute path I set... still not sure where it's happening though.



*This all took a while, as rebuilt VM and verified on 2.7.8 and 2.7.9..

S++




<blockquote> On Monday, March 9, 2015 12:17 AM, Stuart Axon <stuaxo2@yahoo.com> wrote:
 > I had a further look - and on windows the file ends up inside the .egg file, on 
 linux it ends up inside the site packages as intended.
 
 
 At a guess it seems like there might be a bug in the path handling on windows. 
 .. I wonder if it's something like this
 
 <a href="http://stackoverflow.com/questions/4579908/cross-platform-splitting-of-path-in-python">http://stackoverflow.com/questions/4579908/cross-platform-splitting-of-path-in-python</a>
 
 which seems an easy way to get an off-by-one error in a path ?
 
</blockquote></div></blockquote></div>