A minimal, robust, and Unicode-aware process launching library using ctypes.
Project description
ctypes-unicode-proclaunch
A minimal, robust, and Unicode-aware process launching library using ctypes.
- No:
- Shell involvement: Arguments are not interpolated or globbed by any shell, ensuring "what you pass is what you get".
- Python
subprocessabstractions: NoPopen/communicate/universal_newlines/encoding drama.
- Yes:
- Native system call usage for maximum control and correctness.
CreateProcessW(NT)forkandexecve(POSIX)
- Unicode on both Python 2 and 3.
- Fully typed.
- Native system call usage for maximum control and correctness.
Features
- Precise Process Spawning: Direct system call wrappers, not wrappers around wrappers.
- Escape-proof Argument Passing: Arguments are not interpreted or glob-expanded.
- Full Unicode Support: Give and receive Unicode paths/arguments everywhere.
- Explicit Environment: Can supply a Unicode environment dictionary. Does not mutate global environment variables.
- Handles Redirection: Pass open file descriptors for
stdin,stdout,stderrjust like with the C API.
Installation
pip install ctypes-unicode-proclaunch
Usage
Process Launched
A Python script print_argv.py:
# coding=utf-8
from __future__ import print_function
import sys
if __name__ == '__main__':
for i, arg in enumerate(sys.argv):
print('sys.argv[%d]=%s' % (i, arg))
NT
# coding=utf-8
from ctypes_unicode_proclaunch import launch, wait
# No `cmd.exe`'s handling of special characters:
process_handle_1 = launch([u'python', u'print_argv.py', u'%USERNAME%'])
wait(process_handle_1)
# sys.argv[0]=print_argv.py
# sys.argv[1]=%USERNAME%
process_handle_2 = launch([u'python', u'print_argv.py', u'Hello', u'&', u'python', u'print_argv.py', u'injected'])
wait(process_handle_2)
# sys.argv[0]=print_argv.py
# sys.argv[1]=Hello
# sys.argv[2]=&
# sys.argv[3]=python
# sys.argv[4]=print_argv.py
# sys.argv[5]=injected
process_handle_3 = launch([u'python', u'print_argv.py', u'*.txt'])
wait(process_handle_3)
# sys.argv[0]=print_argv.py
# sys.argv[1]=*.txt
POSIX
# coding=utf-8
from ctypes_unicode_proclaunch import launch, wait
pid_1 = launch([u'python', u'print_argv.py', u'$HOME'])
wait(pid_1)
# sys.argv[0]=print_argv.py
# sys.argv[1]=$HOME
pid_2 = launch([u'python', u'print_argv.py', u'"test"', u'>', u'$file'])
wait(pid_2)
# sys.argv[0]=print_argv.py
# sys.argv[1]="test"
# sys.argv[2]=>
# sys.argv[3]=$file
pid_3 = launch([u'python', u'print_argv.py', u'*.txt'])
wait(pid_3)
# sys.argv[0]=print_argv.py
# sys.argv[1]=*.txt
Custom Environment and File Redirection
# coding=utf-8
from ctypes_unicode_proclaunch import launch, wait
from read_unicode_environment_variables_dictionary import read_unicode_environment_variables_dictionary
# Doesn't modify `os.environ`
unicode_environment_variables_dictionary = read_unicode_environment_variables_dictionary()
unicode_environment_variables_dictionary[u'COVERAGE_FILE'] = u'test_coverage.sqlite3'
# We pass the file descriptors of the opened files for redirection.
# Just as in the Unix C API.
# The launched processes DO NOT respect the encodings you specified if you opened the files in text mode.
# This means that you should always open files in binary mode (`'rb'`, `'wb'`, etc.) to make that explicit.
with open('test_stdin.txt', 'rb') as f_0, open('test_stdout.txt', 'wb') as f_1, open('test_stderr.txt', 'wb') as f_2:
pid_or_process_handle = launch(
[u'python', u'-m', u'coverage', u'run', u'test.py'],
environment=unicode_environment_variables_dictionary,
stdin_file_descriptor=f_0.fileno(),
stdout_file_descriptor=f_1.fileno(),
stderr_file_descriptor=f_2.fileno()
)
wait(pid_or_process_handle)
Contributing
Contributions are welcome! Please submit pull requests or open issues on the GitHub repository.
License
This project is licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ctypes_unicode_proclaunch-0.1.0a1.tar.gz.
File metadata
- Download URL: ctypes_unicode_proclaunch-0.1.0a1.tar.gz
- Upload date:
- Size: 7.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
892e25e39ac8093d697a292cf727a691692f806e0b1a796b0a21cc0a02e0f6e2
|
|
| MD5 |
be11298594a8a14e804165803a07723a
|
|
| BLAKE2b-256 |
6af58ad43acd2beb4a059813a93f988d5b43015a5be3c8daaac603026ecdc7ae
|
File details
Details for the file ctypes_unicode_proclaunch-0.1.0a1-py2.py3-none-any.whl.
File metadata
- Download URL: ctypes_unicode_proclaunch-0.1.0a1-py2.py3-none-any.whl
- Upload date:
- Size: 8.2 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
943e508994ce028fd08cf92eacca6015ec60ce439161e24309b57cbfc7bd28aa
|
|
| MD5 |
20de7b1acce40826f6ec3947b99fcecd
|
|
| BLAKE2b-256 |
b5fc7af1b72797a5c946c26b1340e5f2a5f5ed9135cbfb1f213ee00dc48f1da7
|