guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: python-build-system does not wrap script correctly


From: Maxim Cournoyer
Subject: Re: python-build-system does not wrap script correctly
Date: Sat, 27 Nov 2021 00:00:27 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux)

Hello Foo,

Foo Chuan Wei <chuanwei.foo@hotmail.com> writes:

> I am trying to package "Speedometer" [1]. This is the package
> definition:
>
> (define-public speedometer
>   (package
>     (name "speedometer")
>     (version "2.8")

[...]

This package is 10 years old and uses Python 2.  I hope it is for the
Guix Past channel :-).

> It builds and installs successfully. However, when the wrapper script is
> run, this error appears:
>
> Traceback (most recent call last):
>   File 
> "/gnu/store/chr1cx6ia0is8s9d07s1nzdla30r6vs1-speedometer-2.8/bin/.speedometer-real",
>  line 11, in <module>
>     load_entry_point('Speedometer==2.8', 'console_scripts', 'speedometer')()
>   File 
> "/gnu/store/d3jwdk2v7xck82z3y3hs99033m9nkkw0-python2-2.7.17/lib/python2.7/site-packages/pkg_resources/__init__.py",
>  line 489, in load_entry_point
>     return get_distribution(dist).load_entry_point(group, name)
>   File 
> "/gnu/store/d3jwdk2v7xck82z3y3hs99033m9nkkw0-python2-2.7.17/lib/python2.7/site-packages/pkg_resources/__init__.py",
>  line 2852, in load_entry_point
>     return ep.load()
>   File 
> "/gnu/store/d3jwdk2v7xck82z3y3hs99033m9nkkw0-python2-2.7.17/lib/python2.7/site-packages/pkg_resources/__init__.py",
>  line 2443, in load
>     return self.resolve()
>   File 
> "/gnu/store/d3jwdk2v7xck82z3y3hs99033m9nkkw0-python2-2.7.17/lib/python2.7/site-packages/pkg_resources/__init__.py",
>  line 2449, in resolve
>     module = __import__(self.module_name, fromlist=['__name__'], level=0)
>   File 
> "/gnu/store/chr1cx6ia0is8s9d07s1nzdla30r6vs1-speedometer-2.8/bin/speedometer.py",
>  line 2
>     export 
> PYTHONPATH="/gnu/store/chr1cx6ia0is8s9d07s1nzdla30r6vs1-speedometer-2.8/lib/python2.7/site-packages:/gnu/store/d3jwdk2v7xck82z3y3hs99033m9nkkw0-python2-2.7.17/lib/python2.7/site-packages:/gnu/store/1iszjcyvb537m6cif7fqrrh95r0sg9wp-python2-urwid-2.1.0/lib/python2.7/site-packages${PYTHONPATH:+:}$PYTHONPATH"
>                     ^
> SyntaxError: invalid syntax

For the record, I used this to reproduce the problem:

--8<---------------cut here---------------start------------->8---
(use-modules (gnu packages python)
             (gnu packages python-xyz)
             (guix licenses)
             (guix packages)
             (guix download)
             (guix build-system python))

(define speedometer
  (package
    (name "speedometer")
    (version "2.8")
    (source
     (origin
       (method url-fetch)
       (uri (pypi-uri "Speedometer" version))
       (sha256
        (base32 "0qgpjmahy0wlfszqxg0067ck2xab5k6j42d0ifxg1j281yqnm9bx"))))
    (build-system python-build-system)
    (arguments
     `(#:python ,python-2))
    (propagated-inputs
     `(("python2-urwid" ,python2-urwid)))
    (home-page "https://excess.org/speedometer/";)
    (synopsis "Measure and display the rate of data across a network 
connection")
    (description
     "Console monitor of the rate of data across a network connection or data
being stored in a file.")
    (license lgpl2.1+)))

speedometer
--8<---------------cut here---------------end--------------->8---

> There is apparently something wrong with the wrapper script. What is it?

It's because the speedometer script hacks the arg0 path to resolve the
speedometer.py script, which it proceeds to invoke as a python script:
--8<---------------cut here---------------start------------->8---
# EASY-INSTALL-ENTRY-SCRIPT: 'Speedometer==2.8','console_scripts','speedometer'
__requires__ = 'Speedometer==2.8'
import re
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(
        load_entry_point('Speedometer==2.8', 'console_scripts', 'speedometer')()
    )
--8<---------------cut here---------------end--------------->8---

but the 'wrap' phase of the python-build-system has wrapped it (that is,
speedometer.py is now a shell script that wraps speedometer.py):

Perhaps the wrap phase could have known this wasn't a good idea by
looking at the file extension, but in general executables put under bin/
do not have file extensions anyway.

So it's a special case which is not handled by the wrap phase.

I hope that helps!

Maxim



reply via email to

[Prev in Thread] Current Thread [Next in Thread]