From dbeb5f1f1a018b6a81f899092554ff0af8776ec3 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 1 Apr 2024 21:50:51 +0200 Subject: [PATCH] gnulib-tool.py: Use a standard Python program directory structure. * pygnulib/main.py (main_with_exception_handling): New function for existing code. * .gnulib-tool.py: New file. * pygnulib/constants.py: Update the computation of APP['root']. * gnulib-tool.py: Don't set PYTHONPATH. --- .gnulib-tool.py | 30 ++++++++++++++++++++++++++++++ ChangeLog | 9 +++++++++ gnulib-tool.py | 6 +----- pygnulib/constants.py | 4 ++-- pygnulib/main.py | 2 +- 5 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 .gnulib-tool.py diff --git a/.gnulib-tool.py b/.gnulib-tool.py new file mode 100644 index 0000000000..3b2d6913f3 --- /dev/null +++ b/.gnulib-tool.py @@ -0,0 +1,30 @@ +# Copyright (C) 2024 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# This file exists to satisfy the standard layout of a Python program: +# - a single .py file in the parent directory, +# - any number of .py files in a subdirectory. +# Explanation: https://stackoverflow.com/questions/16981921/relative-imports-in-python-3 +# Without this standard layout, we got +# - errors at runtime: +# from . import constants => ImportError: attempted relative import with no known parent package +# from pygnulib import constants => ModuleNotFoundError: No module named 'pygnulib' +# - error markers in Eclipse + PyDev. + +from pygnulib import main + +if __name__ == '__main__': + main.main_with_exception_handling() diff --git a/ChangeLog b/ChangeLog index ef529a5e4c..7a387b3300 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2024-04-01 Bruno Haible + + gnulib-tool.py: Use a standard Python program directory structure. + * pygnulib/main.py (main_with_exception_handling): New function for + existing code. + * .gnulib-tool.py: New file. + * pygnulib/constants.py: Update the computation of APP['root']. + * gnulib-tool.py: Don't set PYTHONPATH. + 2024-04-01 Bruno Haible gnulib-tool.py: Simplify imports. diff --git a/gnulib-tool.py b/gnulib-tool.py index f94c9c36a7..bb2837a3d5 100755 --- a/gnulib-tool.py +++ b/gnulib-tool.py @@ -144,8 +144,4 @@ else func_fatal_error "python3 not found; try setting GNULIB_TOOL_IMPL=sh" fi -# Setting the PYTHONPATH environment variable is needed to avoid an error: -# from . import constants => ImportError: attempted relative import with no known parent package -# from pygnulib import constants => ModuleNotFoundError: No module named 'pygnulib' -# Explanation: https://stackoverflow.com/questions/16981921/relative-imports-in-python-3 -exec env PYTHONPATH="$gnulib_dir" python3 "$gnulib_dir/pygnulib/main.py" "$@" +exec python3 "$gnulib_dir/.gnulib-tool.py" "$@" diff --git a/pygnulib/constants.py b/pygnulib/constants.py index a6ef32cb47..8f698fe01e 100644 --- a/pygnulib/constants.py +++ b/pygnulib/constants.py @@ -74,8 +74,8 @@ if ENCS['shell'] == None: ENCS['shell'] = 'UTF-8' # Set APP dictionary -APP['path'] = os.path.realpath(sys.argv[0]) # file name of /pygnulib/main.py -APP['root'] = os.path.dirname(os.path.dirname(APP['path'])) # file name of +APP['path'] = os.path.realpath(sys.argv[0]) # file name of /.gnulib-tool.py +APP['root'] = os.path.dirname(APP['path']) # file name of APP['name'] = os.path.join(APP['root'], 'gnulib-tool.py') # Set DIRS directory diff --git a/pygnulib/main.py b/pygnulib/main.py index 31bb434b3a..a57e5b04a3 100644 --- a/pygnulib/main.py +++ b/pygnulib/main.py @@ -1373,7 +1373,7 @@ def main() -> None: pass -if __name__ == '__main__': +def main_with_exception_handling() -> None: try: # Try to execute main() except GLError as error: -- 2.39.5