]> Savannah Git Hosting - gnulib.git/commitdiff
gnulib-tool.py: Use a standard Python program directory structure.
authorBruno Haible <bruno@clisp.org>
Mon, 1 Apr 2024 19:50:51 +0000 (21:50 +0200)
committerBruno Haible <bruno@clisp.org>
Mon, 1 Apr 2024 23:06:20 +0000 (01:06 +0200)
* 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 [new file with mode: 0644]
ChangeLog
gnulib-tool.py
pygnulib/constants.py
pygnulib/main.py

diff --git a/.gnulib-tool.py b/.gnulib-tool.py
new file mode 100644 (file)
index 0000000..3b2d691
--- /dev/null
@@ -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 <https://www.gnu.org/licenses/>.
+#
+
+# 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()
index ef529a5e4c85e5c2b25030561518e632283eb7e3..7a387b3300fe1033053a4659be4bc7569e5ab2cc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2024-04-01  Bruno Haible  <bruno@clisp.org>
+
+       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  <bruno@clisp.org>
 
        gnulib-tool.py: Simplify imports.
index f94c9c36a7cf9ade30bf3182d787d9d3c8c550fb..bb2837a3d5219c2ec196cf18b157ee586ea3be5d 100755 (executable)
@@ -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" "$@"
index a6ef32cb47e7b85c3102bba327fa146df7df879e..8f698fe01efea5d62a995e9dee6a1a5091c07ce4 100644 (file)
@@ -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 <gnulib>/pygnulib/main.py
-APP['root'] = os.path.dirname(os.path.dirname(APP['path'])) # file name of <gnulib>
+APP['path'] = os.path.realpath(sys.argv[0])                 # file name of <gnulib>/.gnulib-tool.py
+APP['root'] = os.path.dirname(APP['path'])                  # file name of <gnulib>
 APP['name'] = os.path.join(APP['root'], 'gnulib-tool.py')
 
 # Set DIRS directory
index 31bb434b3a8962de40cf05b8b76a09f476c86d48..a57e5b04a38368ff2ac43a2222e1ab3ba4d4f46f 100644 (file)
@@ -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: