diff mbox series

[1/2] utils/scanpypi: add setup.py script directory as sys.path[0]

Message ID 20210308134542.22324-1-patrickdepinguin@gmail.com
State Accepted
Headers show
Series [1/2] utils/scanpypi: add setup.py script directory as sys.path[0] | expand

Commit Message

Thomas De Schampheleire March 8, 2021, 1:45 p.m. UTC
From: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>

Even though the directory containing a package's setup.py was added to
sys.path, some setup.py implementations rely on the fact that it is placed
in sys.path[0].

An example package is 'cram' which failed to be added with scanpypi:

    Traceback (most recent call last):
      File "utils/scanpypi", line 756, in <module>
        main()
      File "utils/scanpypi", line 703, in main
        package.load_setup()
      File "utils/scanpypi", line 303, in load_setup
        setup = imp.load_module('setup', s_file, s_path, s_desc)
      File "/usr/lib/python3.8/imp.py", line 234, in load_module
        return load_source(name, filename, file)
      File "/usr/lib/python3.8/imp.py", line 171, in load_source
        module = _load(spec)
      File "<frozen importlib._bootstrap>", line 702, in _load
      File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 783, in exec_module
      File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
      File "/tmp/scanpypi-2pzc5wb_/python-cram/cram-0.7/setup.py", line 44, in <module>
        long_description=long_description(),
      File "/tmp/scanpypi-2pzc5wb_/python-cram/cram-0.7/setup.py", line 20, in long_description
        return open(os.path.join(sys.path[0], 'README.rst')).read()
    FileNotFoundError: [Errno 2] No such file or directory: '.../buildroot/utils/README.rst'

The corresponding code from cram's setup.py is:

    def long_description():
        """Get the long description from the README"""
        return open(os.path.join(sys.path[0], 'README.rst')).read()

Indeed, the Python documentation says:

https://docs.python.org/3.8/library/sys.html#sys.path
    "...
    As initialized upon program startup, the first item of this list,
    path[0], is the directory containing the script that was used to invoke
    the Python interpreter.
    ..."

Fix this by inserting explicitly at index 0 instead of appending to
sys.path.

Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
---
 utils/scanpypi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Thomas Petazzoni July 25, 2021, 9:44 p.m. UTC | #1
On Mon,  8 Mar 2021 14:45:39 +0100
Thomas De Schampheleire <patrickdepinguin@gmail.com> wrote:

> From: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
> 
> Even though the directory containing a package's setup.py was added to
> sys.path, some setup.py implementations rely on the fact that it is placed
> in sys.path[0].
> 
> An example package is 'cram' which failed to be added with scanpypi:
> 
>     Traceback (most recent call last):
>       File "utils/scanpypi", line 756, in <module>
>         main()
>       File "utils/scanpypi", line 703, in main
>         package.load_setup()
>       File "utils/scanpypi", line 303, in load_setup
>         setup = imp.load_module('setup', s_file, s_path, s_desc)
>       File "/usr/lib/python3.8/imp.py", line 234, in load_module
>         return load_source(name, filename, file)
>       File "/usr/lib/python3.8/imp.py", line 171, in load_source
>         module = _load(spec)
>       File "<frozen importlib._bootstrap>", line 702, in _load
>       File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
>       File "<frozen importlib._bootstrap_external>", line 783, in exec_module
>       File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
>       File "/tmp/scanpypi-2pzc5wb_/python-cram/cram-0.7/setup.py", line 44, in <module>
>         long_description=long_description(),
>       File "/tmp/scanpypi-2pzc5wb_/python-cram/cram-0.7/setup.py", line 20, in long_description
>         return open(os.path.join(sys.path[0], 'README.rst')).read()
>     FileNotFoundError: [Errno 2] No such file or directory: '.../buildroot/utils/README.rst'
> 
> The corresponding code from cram's setup.py is:
> 
>     def long_description():
>         """Get the long description from the README"""
>         return open(os.path.join(sys.path[0], 'README.rst')).read()
> 
> Indeed, the Python documentation says:
> 
> https://docs.python.org/3.8/library/sys.html#sys.path
>     "...
>     As initialized upon program startup, the first item of this list,
>     path[0], is the directory containing the script that was used to invoke
>     the Python interpreter.
>     ..."
> 
> Fix this by inserting explicitly at index 0 instead of appending to
> sys.path.
> 
> Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
> ---
>  utils/scanpypi | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

Thanks a lot, I've applied both patches. I don't know exactly how that
will behave with PyPi modules in general, but nobody complained, so the
only way to know is to merge those patches, and see if they cause
problems :-)

Thanks!

Thomas
Peter Korsgaard Aug. 5, 2021, 8:07 p.m. UTC | #2
>>>>> "Thomas" == Thomas De Schampheleire <patrickdepinguin@gmail.com> writes:

 > From: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
 > Even though the directory containing a package's setup.py was added to
 > sys.path, some setup.py implementations rely on the fact that it is placed
 > in sys.path[0].

 > An example package is 'cram' which failed to be added with scanpypi:

 >     Traceback (most recent call last):
 >       File "utils/scanpypi", line 756, in <module>
 >         main()
 >       File "utils/scanpypi", line 703, in main
 >         package.load_setup()
 >       File "utils/scanpypi", line 303, in load_setup
 >         setup = imp.load_module('setup', s_file, s_path, s_desc)
 >       File "/usr/lib/python3.8/imp.py", line 234, in load_module
 >         return load_source(name, filename, file)
 >       File "/usr/lib/python3.8/imp.py", line 171, in load_source
 >         module = _load(spec)
 >       File "<frozen importlib._bootstrap>", line 702, in _load
 >       File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
 >       File "<frozen importlib._bootstrap_external>", line 783, in exec_module
 >       File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
 >       File "/tmp/scanpypi-2pzc5wb_/python-cram/cram-0.7/setup.py", line 44, in <module>
 >         long_description=long_description(),
 >       File "/tmp/scanpypi-2pzc5wb_/python-cram/cram-0.7/setup.py", line 20, in long_description
 >         return open(os.path.join(sys.path[0], 'README.rst')).read()
 >     FileNotFoundError: [Errno 2] No such file or directory: '.../buildroot/utils/README.rst'

 > The corresponding code from cram's setup.py is:

 >     def long_description():
 >         """Get the long description from the README"""
 >         return open(os.path.join(sys.path[0], 'README.rst')).read()

 > Indeed, the Python documentation says:

 > https://docs.python.org/3.8/library/sys.html#sys.path
 >     "...
 >     As initialized upon program startup, the first item of this list,
 >     path[0], is the directory containing the script that was used to invoke
 >     the Python interpreter.
 >     ..."

 > Fix this by inserting explicitly at index 0 instead of appending to
 > sys.path.

 > Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>

Committed to 2021.02.x and 2021.05.x, thanks.
diff mbox series

Patch

diff --git a/utils/scanpypi b/utils/scanpypi
index 47c7c00c60..24c64dddde 100755
--- a/utils/scanpypi
+++ b/utils/scanpypi
@@ -297,7 +297,7 @@  class BuildrootPackage():
         """
         current_dir = os.getcwd()
         os.chdir(self.tmp_extract)
-        sys.path.append(self.tmp_extract)
+        sys.path.insert(0,self.tmp_extract)
         s_file, s_path, s_desc = imp.find_module('setup', [self.tmp_extract])
         setup = imp.load_module('setup', s_file, s_path, s_desc)
         if self.metadata_name in self.setup_args: