[Jython-checkins] jython: Ignore JYTHON_HOME during installation of pip (fixes #2345).

jeff.allen jython-checkins at python.org
Sat Jul 20 17:16:29 EDT 2019


https://hg.python.org/jython/rev/6e1f58fc7445
changeset:   8254:6e1f58fc7445
user:        Jeff Allen <ja.py at farowl.co.uk>
date:        Sat Jul 20 19:13:11 2019 +0100
summary:
  Ignore JYTHON_HOME during installation of pip (fixes #2345).

And stop warning people about it in README too.

files:
  NEWS                                                         |   1 +
  README.md                                                    |   4 -
  README.txt                                                   |  16 +-
  installer/src/java/org/python/util/install/ChildProcess.java |  54 ++++++---
  installer/src/java/org/python/util/install/JarInstaller.java |   2 +
  5 files changed, 46 insertions(+), 31 deletions(-)


diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@
 
 Development tip
   Bugs fixed
+    - [ 2345 ] Installing pip fails if JYTHON_HOME points to old installation
     - [ 2774 ] test_ssl failures from weak certificate
     - [ 2768 ] Allow bytearray + and += to accept buffer protocol objects
     - [ 2742 ] JARs for bouncycastle out of date (upgrade to 1.16)
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -3,12 +3,8 @@
 
 This is the development repository of Jython. Along with language and runtime compatibility with CPython 2.7, Jython 2.7 provides substantial support of the Python ecosystem. This includes built-in support of *pip/setuptools* (you can use with `bin/pip`) and a native launcher for Windows (`bin/jython.exe`), with the implication that you can finally install Jython scripts on Windows.
 
-**Note that if you have `JYTHON_HOME` set, you should unset it to avoid problems with the installer and pip/setuptools.**
-
 Jim Baker presented a talk at PyCon 2015 about Jython 2.7, including demos of new features: https://www.youtube.com/watch?v=hLm3garVQFo
 
-The release was compiled on OSX using JDK 7 and requires a minimum of Java 7 to run.
-
 Please try this release out and report any bugs at http://bugs.jython.org
 
 You can test your installation of Jython (not the standalone jar) by running the regression tests, with the command:
diff --git a/README.txt b/README.txt
--- a/README.txt
+++ b/README.txt
@@ -6,11 +6,7 @@
 language and runtime compatibility with CPython 2.7, Jython 2.7
 provides substantial support of the Python ecosystem. This includes
 built-in support of pip/setuptools (you can use with bin/pip) and a
-native launcher for Windows (bin/jython.exe), with the implication
-that you can finally install Jython scripts on Windows.
-
-**Note that if you have JYTHON_HOME set, you should unset it to avoid
-problems with the installer and pip/setuptools.**
+native launcher for Windows (bin/jython.exe).
 
 Jim Baker presented a talk at PyCon 2015 about Jython 2.7, including
 demos of new features: https://www.youtube.com/watch?v=hLm3garVQFo
@@ -31,8 +27,8 @@
 
 See ACKNOWLEDGMENTS for details about Jython's copyright, license,
 contributors, and mailing lists; and NEWS for detailed release notes,
-including bugs fixed, backwards breaking changes, and new features. We
-sincerely thank all who contribute to Jython, including - but not
-limited to - bug reports, patches, pull requests, documentation
-changes, support emails, and fantastic conversation on Freenode at
-#jython. Join us there for your questions and answers!
+including bugs fixed, backwards breaking changes, and new features.
+
+We sincerely thank all who contributed to this release of Jython,
+through bug reports, patches, pull requests, documentation changes,
+email and conversation in all media.
diff --git a/installer/src/java/org/python/util/install/ChildProcess.java b/installer/src/java/org/python/util/install/ChildProcess.java
--- a/installer/src/java/org/python/util/install/ChildProcess.java
+++ b/installer/src/java/org/python/util/install/ChildProcess.java
@@ -6,7 +6,9 @@
 import java.io.InputStreamReader;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Easy start of a child process.
@@ -86,6 +88,11 @@
     private String _command[] = null;
 
     /**
+     * Environment name-value pairs to add or remove (if null) at the start of {@link #run()}.
+     */
+    private Map<String, String> _environmentChanges = new HashMap<>();
+
+    /**
      * The timeout (in milliseconds)
      */
     private long _timeout = INFINITE_TIMEOUT;
@@ -170,6 +177,16 @@
 
     public void setCWD(Path cwd) { _cwd = cwd; }
 
+    /**
+     * Set or delete an environment variable for the subsequently run command.
+     *
+     * @param key name of variable
+     * @param value new value or {@code null} to delete it.
+     */
+    public void putEnvironment(String key, String value) {
+        _environmentChanges.put(key, value);
+    }
+
     public Path getCWD() { return _cwd; }
 
     /**
@@ -263,14 +280,23 @@
         try {
             // determine start time
             _startTime = System.currentTimeMillis();
-            // start the process
+            // Create and configure the process specification
             ProcessBuilder pb = new ProcessBuilder();
             pb.command(getCommand());
             if (getCWD() != null) {
                 pb.directory(getCWD().toFile());
             }
+            // Adjust the environment variables from the default System.getenv()
+            for (Map.Entry<String, String> change : _environmentChanges.entrySet()) {
+                if (change.getValue() == null) {
+                    pb.environment().remove(change.getKey());
+                } else {
+                    pb.environment().put(change.getKey(), change.getValue());
+                }
+            }
+            // Run the process with redirected input and error streams.
+            debugCommand(pb);
             _process = pb.start();
-            debugCommand();
             // handle stdout and stderr
             OutputMonitor stdoutMonitor = new OutputMonitor(_process.getInputStream());
             stdoutMonitor.start();
@@ -349,21 +375,15 @@
     /**
      * Lists the submitted command (if so indicated)
      */
-    private void debugCommand() {
+    private void debugCommand(ProcessBuilder pb) {
         if (isDebug()) {
-            String[] command = getCommand();
-            if (command != null) {
-                System.out.print("[ChildProcess] command '");
-                for (int i = 0; i < command.length; i++) {
-                    String commandPart = command[i];
-                    if (i == 0) {
-                        System.out.print(commandPart);
-                    } else {
-                        System.out.print(" " + commandPart);
-                    }
-                }
-                System.out.println("' is now running...");
-            }
+            System.out.print("[ChildProcess] command = ");
+            System.out.println(pb.command());
+            System.out.print("[ChildProcess] environment = ");
+            System.out.println(pb.environment());
+            System.out.print("[ChildProcess] working directory = ");
+            System.out.println(pb.directory());
         }
     }
-}
\ No newline at end of file
+}
+
diff --git a/installer/src/java/org/python/util/install/JarInstaller.java b/installer/src/java/org/python/util/install/JarInstaller.java
--- a/installer/src/java/org/python/util/install/JarInstaller.java
+++ b/installer/src/java/org/python/util/install/JarInstaller.java
@@ -188,6 +188,8 @@
             }
             ChildProcess childProcess = new ChildProcess(command);
             childProcess.setCWD(bindir);
+            // JYTHON_HOME will be wrong if set: see https://bugs.jython.org/issue2345
+            childProcess.putEnvironment("JYTHON_HOME", null);
             errorCode = childProcess.run();
         } catch (Throwable t) {
             errorCode = 1;

-- 
Repository URL: https://hg.python.org/jython


More information about the Jython-checkins mailing list