Bernhard Reiter
Bernhard Reiter

Reputation: 781

Override setup.cfg options to achieve default behavior

I have a setup.cfg containing Linux installation options,

[install]
prefix=/opt/foo
install-lib=/opt/foo

which corresponds to the default directory layout this project has under Linux.

Now the same project uses py2exe for Windows installation. Currently, I'm using a .bat file to move this setup.cfg out of the way while running python setup.py py2exe in order not to confuse py2exe with those setting, which I think amounts to distutils/py2exe using default parameters.

I'd much rather invoke python setup.py py2exe with some extra arguments to override those specified in setup.cfg, but using --prefix= --install-lib= gives me

[...]
*** copy data files ***
Traceback (most recent call last):
  File "setup.py", line 158, in <module>
    **platformOptions)
  File "C:\Python27\lib\distutils\core.py", line 152, in setup
    dist.run_commands()
  File "C:\Python27\lib\distutils\dist.py", line 953, in run_commands
    self.run_command(cmd)
  File "C:\Python27\lib\distutils\dist.py", line 972, in run_command
    cmd_obj.run()
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 243, in run
    self._run()
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 312, in _run
    self.create_binaries(py_files, extensions, dlls)
  File "C:\Python27\lib\site-packages\py2exe\build_exe.py", line 560, in create_binaries
    install_data.ensure_finalized()
  File "C:\Python27\lib\distutils\cmd.py", line 109, in ensure_finalized
    self.finalize_options()
  File "C:\Python27\lib\distutils\command\install_data.py", line 41, in finalize_options
    ('force', 'force'),
  File "C:\Python27\lib\distutils\cmd.py", line 298, in set_undefined_options
    src_cmd_obj.ensure_finalized()
  File "C:\Python27\lib\distutils\cmd.py", line 109, in ensure_finalized
    self.finalize_options()
  File "C:\Python27\lib\distutils\command\install.py", line 353, in finalize_options
    'userbase', 'usersite')
  File "C:\Python27\lib\distutils\command\install.py", line 504, in convert_paths
    setattr(self, attr, convert_path(getattr(self, attr)))
  File "C:\Python27\lib\distutils\util.py", line 199, in convert_path
    raise ValueError, "path '%s' cannot be absolute" % pathname
ValueError: path '/opt/trelby' cannot be absolute

which is the same behavior as when not trying to override setup.cfg parameters at all, so something seems to go wrong.

I'm also willing to alternatively set distutils.core.setup()'s options parameter in setup.py, if necessary, but the main question seems to be: to what value, in order to achieve default py2exe behavior?

BTW, code is found at https://github.com/oskusalerma/trelby

Upvotes: 3

Views: 2364

Answers (1)

Dima Tisnek
Dima Tisnek

Reputation: 11779

I tried to replicate you error, though without access to win*, and possibly with newer distutils.

ValueError: path '/opt/trelby' cannot be absolute this is important, if you must use relative paths for whatever reason, make sure you do use relative paths.

I don't get that error with plain distutils.

python setup.py install --prefix /some/other doesn't do anything for me if there install-lib is specified in config.cfg

python setup.py install --install-lib /some/other does change the installation path.

in other words, the priority in my setup is:

  • install-lib cmd line arg
  • install-lib in setup.fg
  • prefix cmd line arg
  • prefix in setup.cfg

Please test without py2exe. if your problem stems from distutils, perhaps you can upgrade 'em. Alternatively it could be py2exe that swallows command line arguments and doesn't pass those to distutils, perhaps you can track it down and submit a patch.

Upvotes: 2

Related Questions