Zrobiłem swoją domową pracę, szukając rozwiązań. Mam projekt autoconf z kilkoma prostymi skryptami Pythona.

W moim configure.ac (pokazując tylko odpowiedni fragment):

AM_PATH_PYTHON([3.8])

Próbuję zacząć korzystać z 3.x, ponieważ 2.x zostanie wycofany w przyszłym roku (2020).

Mój plik Makefile.am:

python_PYTHON = uptocloud.py loadvariant.py
# I am not sure the following line is execute or the above one execute
# more likely the above one got executed
loadvariant : loadvariant.py
   ${PYTHON} -m py_compile $^ || exit 1
   @echo -e "#!/bin/sh\n${PYTHON} ${pythondir}/${@}.pyo \$$" > $@
   sed -i '2s,$$,*,' $@
   chmod +x $@

Po skonfigurowaniu --prefix $ HOME, make, make install (tylko na tym etapie Python został skompilowany) otrzymuję następujący komunikat o błędzie:

 /usr/bin/install -c -m 644 uptocloud.py loadvariant.py load1variant.py '/home/myhome/lib/python3.8/site-packages'
<string>:2: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
Byte-compiling python modules...
uptocloud.pyloadvariant.py  File "/home/myhome/lib/python3.8/site-packages/loadvariant.py", line 57
    print "Connected to {} on {}!\n".format(pgdbname, hostname)
          ^
SyntaxError: invalid syntax

 Byte-compiling python modules (optimized versions) ...
 uptocloud.pyloadvariant.py

Komunikat o błędzie to typowy python2 niekompatybilny z python3, nie jest tutaj przedmiotem uwagi. Miałem nadzieję, że proces tworzenia się tutaj zatrzyma, ale trwa aż do końca i pracuje nad innymi zadaniami kompilacji. $ {PYTHON} -m py_compile FOO.py || Wygląda na to, że wyjście 1 tu nie działa. Jest to napisana odręcznie reguła, która zastępuje automatycznie generowane niejawne reguły.

Moje pytanie, jak mam się tutaj zatrzymać i poprosić mnie o naprawienie błędów składniowych w skrypcie Pythona.

0
Kemin Zhou 19 grudzień 2019, 22:27

1 odpowiedź

To dobra odpowiedź, ale w 50% poprawna. Po naprawieniu powyższego błędu składniowego dla wydruku. Tym razem próbowałem ponownie zainstalować make, proces kompilacji został zatrzymany. Nie wiem, dlaczego tak się stało. Oto krótka wersja komunikatu o błędzie (usunięcie zbędnych).

make[2]: Entering directory '/home/myhome/coding/projname/scripts'
/usr/local/bin/python3 -m py_compile loadvariant.py || exit 1
Traceback (most recent call last):
  File "/usr/local/lib/python3.8/py_compile.py", line 144, in compile
    code = loader.source_to_code(source_bytes, dfile or file,
  File "<frozen importlib._bootstrap_external>", line 846, in source_to_code
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "loadvariant.py", line 186
    print sqlstr
          ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(sqlstr)?

During handling of the above exception, another exception occurred:
# more lines of error removed here

NameError: name 'quiet' is not defined
Makefile:860: recipe for target 'loadvariant' failed
make[2]: *** [loadvariant] Error 1

Wygląda na to, że przepisana odręcznie zasada działa. Po naprawieniu większej liczby błędów składniowych czasami proces tworzenia pomija niektóre błędy, a czasami się zatrzymuje. Nadal czegoś mi brakuje.

0
Kemin Zhou 19 grudzień 2019, 22:56