author | Edouard Tisserant <edouard@beremiz.fr> |
Thu, 05 Dec 2024 13:56:59 +0100 | |
changeset 4060 | d2f5eb3c7d6e |
parent 3881 | 0b3ac94f494c |
permissions | -rw-r--r-- |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
2 |
# -*- coding: utf-8 -*- |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
3 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
4 |
# subset of subprocess built-in module using posix_spawn rather than fork. |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
5 |
|
3750
f62625418bff
automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents:
3293
diff
changeset
|
6 |
|
f62625418bff
automated conversion using 2to3-3.9 tool
GP Orcullo <kinsamanka@gmail.com>
parents:
3293
diff
changeset
|
7 |
|
3821
f7bc4e5832be
Runtime: spawn_subprocess: handle non-bytes args
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
3750
diff
changeset
|
8 |
import os, sys |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
9 |
import signal |
3293
d2b0c768755d
Runtime: Better handling of nested strings in spawn_subprocess commandline parsing
Edouard Tisserant
parents:
2537
diff
changeset
|
10 |
import shlex |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
11 |
import posix_spawn |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
12 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
13 |
PIPE = "42" |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
14 |
|
3821
f7bc4e5832be
Runtime: spawn_subprocess: handle non-bytes args
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
3750
diff
changeset
|
15 |
fsencoding = sys.getfilesystemencoding() |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
16 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
17 |
class Popen(object): |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
18 |
def __init__(self, args, stdin=None, stdout=None, stderr=None): |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
19 |
self.returncode = None |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
20 |
self.stdout = None |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
21 |
self.stderr = None |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
22 |
self.stdin = None |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
23 |
file_actions = posix_spawn.FileActions() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
24 |
if stdout is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
25 |
# child's stdout, child 2 parent pipe |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
26 |
c1pread, c1pwrite = os.pipe() |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
27 |
# attach child's stdout to writing en of c1p pipe |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
28 |
file_actions.add_dup2(c1pwrite, 1) |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
29 |
# close other end |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
30 |
file_actions.add_close(c1pread) |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
31 |
if stderr is not None: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
32 |
# child's stderr, child 2 parent pipe |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
33 |
c2pread, c2pwrite = os.pipe() |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
34 |
# attach child's stderr to writing en of c2p pipe |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
35 |
file_actions.add_dup2(c2pwrite, 2) |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
36 |
# close other end |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
37 |
file_actions.add_close(c2pread) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
38 |
if stdin is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
39 |
# child's stdin, parent to child pipe |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
40 |
p2cread, p2cwrite = os.pipe() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
41 |
# attach child's stdin to reading en of p2c pipe |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
42 |
file_actions.add_dup2(p2cread, 0) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
43 |
# close other end |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
44 |
file_actions.add_close(p2cwrite) |
3821
f7bc4e5832be
Runtime: spawn_subprocess: handle non-bytes args
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
3750
diff
changeset
|
45 |
args = [s.encode(fsencoding) for s in args if type(s)==str] |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
46 |
self.pid = posix_spawn.posix_spawnp(args[0], args, file_actions=file_actions) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
47 |
if stdout is not None: |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
48 |
self.stdout = os.fdopen(c1pread) |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
49 |
os.close(c1pwrite) |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
50 |
if stderr is not None: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
51 |
self.stderr = os.fdopen(c2pread) |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
52 |
os.close(c2pwrite) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
53 |
if stdin is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
54 |
self.stdin = os.fdopen(p2cwrite, 'w') |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
55 |
os.close(p2cread) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
56 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
57 |
def _wait(self): |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
58 |
if self.returncode is None: |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
59 |
self.returncode = os.waitpid(self.pid, 0)[1] |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
60 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
61 |
def communicate(self): |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
62 |
if self.stdin is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
63 |
self.stdin.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
64 |
self.stdin = None |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
65 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
66 |
if self.stdout is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
67 |
stdoutdata = self.stdout.read() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
68 |
else: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
69 |
stdoutdata = "" |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
70 |
|
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
71 |
if self.stderr is not None: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
72 |
stderrdata = self.stderr.read() |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
73 |
else: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
74 |
stderrdata = "" |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
75 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
76 |
self._wait() |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
77 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
78 |
if self.stdout is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
79 |
self.stdout.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
80 |
self.stdout = None |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
81 |
|
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
82 |
if self.stderr is not None: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
83 |
self.stderr.close() |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
84 |
self.stderr = None |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
85 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
86 |
return (stdoutdata, stderrdata) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
87 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
88 |
def wait(self): |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
89 |
if self.stdin is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
90 |
self.stdin.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
91 |
self.stdin = None |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
92 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
93 |
self._wait() |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
94 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
95 |
if self.stdout is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
96 |
self.stdout.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
97 |
self.stdout = None |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
98 |
|
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
99 |
if self.stderr is not None: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
100 |
self.stderr.close() |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
101 |
self.stderr = None |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
102 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
103 |
return self.returncode |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
104 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
105 |
def poll(self): |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
106 |
if self.returncode is None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
107 |
pid, ret = os.waitpid(self.pid, os.WNOHANG) |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
108 |
if (pid, ret) != (0, 0): |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
109 |
self.returncode = ret |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
110 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
111 |
if self.stdin is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
112 |
self.stdin.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
113 |
self.stdin = None |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
114 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
115 |
if self.stdout is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
116 |
self.stdout.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
117 |
self.stdout = None |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
118 |
|
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
119 |
if self.stderr is not None: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
120 |
self.stderr.close() |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
121 |
self.stderr = None |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
122 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
123 |
return self.returncode |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
124 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
125 |
def kill(self): |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
126 |
os.kill(self.pid, signal.SIGKILL) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
127 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
128 |
if self.stdin is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
129 |
self.stdin.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
130 |
self.stdin = None |
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
131 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
132 |
if self.stdout is not None: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
133 |
self.stdout.close() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
134 |
self.stdout = None |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
135 |
|
3860
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
136 |
if self.stderr is not None: |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
137 |
self.stderr.close() |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
138 |
self.stderr = None |
a1d7187b8402
Runtime: Add stderr support to local posix spawn based subprocess replacement
Edouard Tisserant
parents:
3293
diff
changeset
|
139 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
140 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
141 |
def call(*args): |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
142 |
cmd = [] |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
143 |
if isinstance(args[0], str): |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
144 |
if len(args) == 1: |
3293
d2b0c768755d
Runtime: Better handling of nested strings in spawn_subprocess commandline parsing
Edouard Tisserant
parents:
2537
diff
changeset
|
145 |
# splitting of arguments that cares about |
d2b0c768755d
Runtime: Better handling of nested strings in spawn_subprocess commandline parsing
Edouard Tisserant
parents:
2537
diff
changeset
|
146 |
# use of simple and double quotes |
d2b0c768755d
Runtime: Better handling of nested strings in spawn_subprocess commandline parsing
Edouard Tisserant
parents:
2537
diff
changeset
|
147 |
cmd = shlex.split(args[0]) |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
148 |
else: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
149 |
cmd = args |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
150 |
elif isinstance(args[0], list) and len(args) == 1: |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
151 |
cmd = args[0] |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
152 |
else: |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
153 |
raise Exception("Wrong arguments passed to subprocess.call") |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
154 |
pid = posix_spawn.posix_spawnp(cmd[0], cmd) |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
155 |
return os.waitpid(pid, 0) |
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
156 |
|
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
157 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
158 |
if __name__ == '__main__': |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
159 |
# unit test |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
160 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
161 |
p = Popen(["tr", "abc", "def"], stdin=PIPE, stdout=PIPE) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
162 |
p.stdin.write("blah") |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
163 |
p.stdin.close() |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
164 |
print(p.stdout.read()) |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
165 |
p.wait() |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
166 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
167 |
p = Popen(["tr", "abc", "def"], stdin=PIPE, stdout=PIPE) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
168 |
p.stdin.write("blah") |
2492
7dd551ac2fa0
check_sources.sh makes me become even less productive
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
2322
diff
changeset
|
169 |
print(p.communicate()) |
2322
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
170 |
|
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
171 |
call("echo blah0") |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
172 |
call(["echo", "blah1"]) |
7ce4e5cf6339
Added runtime/spawn_subprocess.py. Force use posix spawn instead of fork, with API similar to subprocess. Using fork in runtime is incompatible with Xenomai, because memory is locked and this can lead to out of memory error.
Edouard Tisserant
parents:
diff
changeset
|
173 |
call("echo", "blah2") |