New submission from Lukas Wunner:

The principle of least surprise suggests that run_setup() should behave 
equivalently to a command line invocation of setup.py. However there are 
currently (at least) two issues preventing this:


(a) When calling exec(), both a globals and a locals dict is passed.

According to the documentation: "If exec gets two separate objects as globals 
and locals, the code will be executed as if it were embedded in a class 
definition." [1] Consequence: "The scope of names defined in a class block is 
limited to the class block; it does not extend to the code blocks of methods". 
[2]

One example where this is relevant is the "MarkupSafe" PyPI package [3]: Its 
setup.py defines a class BuildFailed which is used in other methods defined in 
setup.py. Calling run_setup() with this setup.py will therefore fail. Calling 
setup.py from the command line works.

Solution: Only pass a globals dict to exec().


(b) The globals dict does not contain '__name__':'__main__'.

Many setup.py scripts use the idiomatic 'conditional script' stanza "if 
__name__ == '__main__'". An example is the "PyYAML" PyPI package. [4] In these 
cases, run_setup() will raise a RuntimeError exception 
("'distutils.core.setup()' was never called").

Solution: Add '__name__':'__main__' to the globals dict.


Attached are patches to fix these issues in Python 2.6 to 3.4.


[1] http://docs.python.org/3/library/functions.html#exec
[2] http://docs.python.org/reference/executionmodel.html#naming-and-binding
[3] https://pypi.python.org/pypi/MarkupSafe
[4] https://pypi.python.org/pypi/PyYAML

----------
assignee: eric.araujo
components: Distutils
files: run_setup-py32-py33-py34.diff
keywords: patch
messages: 197259
nosy: eric.araujo, l, tarek
priority: normal
severity: normal
status: open
title: run_setup() behavior differs from cli invocation of setup.py
type: behavior
versions: Python 2.6, Python 2.7, Python 3.1, Python 3.2, Python 3.3, Python 3.4
Added file: http://bugs.python.org/file31661/run_setup-py32-py33-py34.diff

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue18970>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to