Skip to content

Commit 7b5a9ec

Browse files
committed
[GR-14629] Fix execution of subprocesses on JVM inside a venv
PullRequest: graalpython/450
2 parents cc98f60 + df12a88 commit 7b5a9ec

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,15 @@ protected void launch(Builder contextBuilder) {
394394
unbufferedIO = unbufferedIO || System.getenv("PYTHONUNBUFFERED") != null;
395395
}
396396

397-
// The unlikely separator is used because options need to be strings. See
398-
// PythonOptions.getExecutableList()
399-
contextBuilder.option("python.ExecutableList", String.join("🏆", getExecutableList()));
400-
setContextOptionIfUnset(contextBuilder, "python.Executable", getExecutable());
397+
String executable = getContextOptionIfSetViaCommandLine("python.Executable");
398+
if (executable != null) {
399+
contextBuilder.option("python.ExecutableList", executable);
400+
} else {
401+
contextBuilder.option("python.Executable", getExecutable());
402+
// The unlikely separator is used because options need to be
403+
// strings. See PythonOptions.getExecutableList()
404+
contextBuilder.option("python.ExecutableList", String.join("🏆", getExecutableList()));
405+
}
401406

402407
// setting this to make sure our TopLevelExceptionHandler calls the excepthook
403408
// to print Python exceptions
@@ -471,16 +476,21 @@ protected void launch(Builder contextBuilder) {
471476
System.exit(rc);
472477
}
473478

474-
private void setContextOptionIfUnset(Builder contextBuilder, String key, String value) {
479+
private String getContextOptionIfSetViaCommandLine(String key) {
475480
if (System.getProperty("polyglot." + key) != null) {
476-
return;
481+
return System.getProperty("polyglot." + key);
477482
}
478483
for (String f : givenArguments) {
479484
if (f.startsWith("--" + key)) {
480-
return;
485+
String[] splits = f.split("=", 2);
486+
if (splits.length > 1) {
487+
return splits[1];
488+
} else {
489+
return "true";
490+
}
481491
}
482492
}
483-
contextBuilder.option(key, value);
493+
return null;
484494
}
485495

486496
private static void printFileNotFoundException(NoSuchFileException e) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@
3131
import java.util.concurrent.ConcurrentHashMap;
3232
import java.util.function.Supplier;
3333

34-
import org.graalvm.options.OptionDescriptors;
35-
3634
import com.oracle.graal.python.builtins.Python3Core;
3735
import com.oracle.graal.python.builtins.objects.PNone;
3836
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
@@ -91,6 +89,8 @@
9189
import com.oracle.truffle.api.source.Source.SourceBuilder;
9290
import com.oracle.truffle.api.source.SourceSection;
9391

92+
import org.graalvm.options.OptionDescriptors;
93+
9494
@TruffleLanguage.Registration(id = PythonLanguage.ID, name = PythonLanguage.NAME, version = PythonLanguage.VERSION, characterMimeTypes = PythonLanguage.MIME_TYPE, interactive = true, internal = false, contextPolicy = TruffleLanguage.ContextPolicy.SHARED)
9595
@ProvidedTags({StandardTags.CallTag.class, StandardTags.StatementTag.class, StandardTags.RootTag.class, StandardTags.TryBlockTag.class, StandardTags.ExpressionTag.class,
9696
DebuggerTags.AlwaysHalt.class})
@@ -218,7 +218,8 @@ private void ensureHomeInOptions(Env env) {
218218
"\n\tSysPrefix: {1}" +
219219
"\n\tSysBasePrefix: {2}" +
220220
"\n\tCoreHome: {3}" +
221-
"\n\tStdLibHome: {4}", home.getPath(), sysPrefix, basePrefix, coreHome, stdLibHome)));
221+
"\n\tStdLibHome: {4}" +
222+
"\n\tExecutable: {5}", home.getPath(), sysPrefix, basePrefix, coreHome, stdLibHome, env.getOptions().get(PythonOptions.Executable))));
222223
}
223224
}
224225

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixModuleBuiltins.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,14 @@
6666
import java.util.HashMap;
6767
import java.util.HashSet;
6868
import java.util.List;
69+
import java.util.Locale;
6970
import java.util.Map;
7071
import java.util.Map.Entry;
7172
import java.util.Random;
7273
import java.util.Set;
7374
import java.util.concurrent.TimeUnit;
7475

76+
import com.oracle.graal.python.PythonLanguage;
7577
import com.oracle.graal.python.builtins.Builtin;
7678
import com.oracle.graal.python.builtins.CoreFunctions;
7779
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
@@ -135,7 +137,6 @@
135137
import com.oracle.truffle.api.profiles.ValueProfile;
136138
import com.sun.security.auth.UnixNumericGroupPrincipal;
137139
import com.sun.security.auth.UnixNumericUserPrincipal;
138-
import java.util.Locale;
139140

140141
@CoreFunctions(defineModule = "posix")
141142
public class PosixModuleBuiltins extends PythonBuiltins {
@@ -1340,6 +1341,7 @@ int system(String cmd) {
13401341
if (!context.isExecutableAccessAllowed()) {
13411342
return -1;
13421343
}
1344+
PythonLanguage.getLogger().fine(() -> "os.system: " + cmd);
13431345
String[] command = new String[]{shell[0], shell[1], cmd};
13441346
Env env = context.getEnv();
13451347
try {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PosixSubprocessModuleBuiltins.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@
5151
import java.util.List;
5252
import java.util.Map;
5353

54-
import org.graalvm.nativeimage.ImageInfo;
55-
54+
import com.oracle.graal.python.PythonLanguage;
5655
import com.oracle.graal.python.builtins.Builtin;
5756
import com.oracle.graal.python.builtins.CoreFunctions;
5857
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
@@ -77,6 +76,8 @@
7776
import com.oracle.truffle.api.dsl.NodeFactory;
7877
import com.oracle.truffle.api.dsl.Specialization;
7978

79+
import org.graalvm.nativeimage.ImageInfo;
80+
8081
@CoreFunctions(defineModule = "_posixsubprocess")
8182
public class PosixSubprocessModuleBuiltins extends PythonBuiltins {
8283
@Override
@@ -129,6 +130,7 @@ synchronized int forkExec(PList args, @SuppressWarnings("unused") PList execList
129130
}
130131
}
131132

133+
PythonLanguage.getLogger().fine(() -> "_posixsubprocess.fork_exec: " + String.join(" ", argStrings));
132134
ProcessBuilder pb = new ProcessBuilder(argStrings);
133135
if (p2cread != -1 && p2cwrite != -1) {
134136
pb.redirectInput(Redirect.PIPE);

0 commit comments

Comments
 (0)