-
-
Notifications
You must be signed in to change notification settings - Fork 393
Add subprocess support #791
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
51 commits
Select commit
Hold shift + click to select a range
e448431
[WIP] subprocess support
oremanj 7a8f918
flake8 doesn't like redefinitions so move the OS-specific method docs…
oremanj 581554b
don't assume executing 'python' invokes python 2
oremanj 6d2bc09
fix pypy issues
oremanj 1885487
fix pypy harder
oremanj 3807c64
add links to pypy issues
oremanj 8d5f5a1
add call(), check_call(), check_output(), fix some coverage gaps
oremanj 701655b
add a comment about the dangerous-looking siginfo_t layout assumption
oremanj 51d6a50
yapfify
oremanj 756e55b
Explode _subprocess package into its constituent parts
oremanj 3720fe7
split off wait_reapable into a separate module
oremanj 6be26eb
use AsyncResource, make test less silly
oremanj 77ec5ee
close stdout/stderr when closing child
oremanj f2db971
Rename _platform to _subprocess_platform, move more stuff there, misc…
oremanj ce78d8d
yapfify
oremanj a1d70ca
less aggressive timeout in the hope of reducing test flakiness
oremanj 0ed693b
placate flake8
oremanj ccefeac
win32 support
oremanj 33f6db9
Merge remote-tracking branch 'origin/master' into subprocess
oremanj ab43b2b
merge with new layout of hazmat
oremanj b21f308
yapfify
oremanj 94b8416
fix accidental change to make_clogged_pipe
oremanj e35f11c
add missing file
oremanj fc6e60a
fix unused variable warning
oremanj 869e42b
attempt to fix remaining coverage issues
oremanj 054951d
more small coverage tweaks
oremanj a79eca7
see if this will fix pypy+mac build
oremanj 09c0f43
try again
oremanj b3b2bb0
Stop trying to run a PyPy on Travis OS X -- couldn't get the installa…
oremanj 6380aea
hopefully fix windows flapping; no-cover the line of pypy+OSX only code
oremanj 0eb001c
fix careless error in Windows test
oremanj ad0bc67
updates after code review
oremanj a87a87c
streamline waitid EINTR test in the hopes that it starts working on C…
oremanj 82253ca
fix sense of check
oremanj 4be2609
one more coverage nit
oremanj 5722d4b
add newsfragment
oremanj 9aea79b
Add docs and capture_output parameter
oremanj 3bde9a4
yapf
oremanj 3386ed2
fix newsfragment formatting
oremanj 709eabf
more doc nits
oremanj bd15874
wait_child_exiting takes a trio process, not a stdlib subprocess
oremanj 8bdc217
missed a spot
oremanj 32494e6
updates after code review
oremanj b175e62
fix forgot-to-register test
oremanj 5477ac1
wait for the I/O to probably complete before we try to cancel it
oremanj 3bc7756
fix test_forgot_to_register_with_iocp, make test_too_late_to_cancel @…
oremanj 14c6991
yapf
oremanj ee77992
Use gc_collect_harder instead of trying to fool Trio into not warning
oremanj 300741d
Merge remote-tracking branch 'origin/master' into subprocess
oremanj 879b3b8
Remove run()
oremanj 8ec3a6c
fix newsfragment reference
oremanj File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| Initial :ref:`subprocess support <subprocess>`. | ||
| Add :class:`trio.subprocess.Process`, an async wrapper around the stdlib | ||
| :class:`subprocess.Popen` class, which permits spawning subprocesses | ||
| and communicating with them over standard Trio streams. | ||
| :mod:`trio.subprocess` also reexports all the stdlib :mod:`subprocess` | ||
| exceptions and constants for convenience. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,73 @@ | ||
| # subprocesses are a huge hassle | ||
| # on Linux there is simply no way to async wait for a child to exit except by | ||
| # messing with SIGCHLD and that is ... *such* a mess. Not really | ||
| # tenable. We're better off trying os.waitpid(..., os.WNOHANG), and if that | ||
| # says the process is still going then spawn a thread to sit in waitpid. | ||
| # ......though that waitpid is non-cancellable so ugh. this is a problem, | ||
| # becaues it's also mutating -- you only get to waitpid() once, and you have | ||
| # to do it, because zombies. I guess we could make sure the waitpid thread is | ||
| # daemonic and either it gets back to us eventually (even if our first call to | ||
| # 'await wait()' is cancelled, maybe another one won't be), or else we go away | ||
| # and don't care anymore. | ||
| # I guess simplest is just to spawn a thread at the same time as we spawn the | ||
| # process, with more reasonable notification semantics. | ||
| # or we can poll every 100 ms or something, sigh. | ||
|
|
||
| # on Mac/*BSD then kqueue works, go them. (maybe have WNOHANG after turning it | ||
| # on to avoid a race condition I guess) | ||
|
|
||
| # on Windows, you can either do the thread thing, or something involving | ||
| # WaitForMultipleObjects, or the Job Object API: | ||
| # https://stackoverflow.com/questions/17724859/detecting-exit-failure-of-child-processes-using-iocp-c-windows | ||
| # (see also the comments here about using the Job Object API: | ||
| # https://stackoverflow.com/questions/23434842/python-how-to-kill-child-processes-when-parent-dies/23587108#23587108) | ||
| # however the docs say: | ||
| # "Note that, with the exception of limits set with the | ||
| # JobObjectNotificationLimitInformation information class, delivery of | ||
| # messages to the completion port is not guaranteed; failure of a message to | ||
| # arrive does not necessarily mean that the event did not occur" | ||
| # | ||
| # oh windows wtf | ||
|
|
||
| # We'll probably want to mess with the job API anyway for worker processes | ||
| # (b/c that's the reliable way to make sure we never leave residual worker | ||
| # processes around after exiting, see that stackoverflow question again), so | ||
| # maybe this isn't too big a hassle? waitpid is probably easiest for the | ||
| # first-pass implementation though. | ||
|
|
||
| # the handle version has the same issues as waitpid on Linux, except I guess | ||
| # that on windows the waitpid equivalent doesn't consume the handle. | ||
| # -- wait no, the windows equivalent takes a timeout! and we know our | ||
| # cancellation deadline going in, so that's actually okay. (Still need to use | ||
| # a thread but whatever.) | ||
|
|
||
| # asyncio does RegisterWaitForSingleObject with a callback that does | ||
| # PostQueuedCompletionStatus. | ||
| # this is just a thread pool in disguise (and in principle could have weird | ||
| # problems if you have enough children and run out of threads) | ||
| # it's possible we could do something with a thread that just sits in | ||
| # an alertable state and handle callbacks...? though hmm, maybe the set of | ||
| # events that can notify via callbacks is equivalent to the set that can | ||
| # notify via IOCP. | ||
| # there's WaitForMultipleObjects to let multiple waits share a thread I | ||
| # guess. | ||
| # you can wake up a WaitForMultipleObjectsEx on-demand by using QueueUserAPC | ||
| # to send a no-op APC to its thread. | ||
| # this is also a way to cancel a WaitForSingleObjectEx, actually. So it | ||
| # actually is possible to cancel the equivalent of a waitpid on Windows. | ||
|
|
||
| # Potentially useful observation: you *can* use a socket as the | ||
| # stdin/stdout/stderr for a child, iff you create that socket *without* | ||
| # WSA_FLAG_OVERLAPPED: | ||
| # http://stackoverflow.com/a/5725609 | ||
| # Here's ncm's Windows implementation of socketpair, which has a flag to | ||
| # control whether one of the sockets has WSA_FLAG_OVERLAPPED set: | ||
| # https://github.com/ncm/selectable-socketpair/blob/master/socketpair.c | ||
| # (it also uses listen(1) so it's robust against someone intercepting things, | ||
| # unlike the version in socket.py... not sure anyone really cares, but | ||
| # hey. OTOH it only supports AF_INET, while socket.py supports AF_INET6, | ||
| # fancy.) | ||
| # (or it would be trivial to (re)implement in python, using either | ||
| # socket.socketpair or ncm's version as a model, given a cffi function to | ||
| # create the non-overlapped socket in the first place then just pass it into | ||
| # the socket.socket constructor (avoiding the dup() that fromfd does).) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.