Skip to main content

Execution helpers for simplified usage of subprocess and ssh.

Project description

exec-helpers

https://travis-ci.org/python-useful-helpers/exec-helpers.svg?branch=master https://dev.azure.com/python-useful-helpers/exec-helpers/_apis/build/status/python-useful-helpers.exec-helpers?branchName=master https://coveralls.io/repos/github/python-useful-helpers/exec-helpers/badge.svg?branch=master Documentation Status https://img.shields.io/pypi/v/exec-helpers.svg https://img.shields.io/pypi/pyversions/exec-helpers.svg https://img.shields.io/pypi/status/exec-helpers.svg https://img.shields.io/github/license/python-useful-helpers/exec-helpers.svg https://img.shields.io/badge/code%20style-black-000000.svg

Execution helpers for simplified usage of subprocess and ssh. Why another subprocess wrapper and why no clear paramiko?

Historically paramiko offers good ssh client, but with specific limitations: you can call command with timeout, but without receiving return code, or call command and wait for return code, but without timeout processing.

In the most cases, we are need just simple SSH client with comfortable API for calls, calls via SSH proxy and checking return code/stderr. This library offers this functionality with connection memorizing, deadlock free polling and friendly result objects (with inline decoding of YAML, JSON, binary or just strings). In addition this library offers the same API for subprocess calls, but with specific limitation: no parallel calls (for protection from race conditions).

Pros:

Python 3.5
Python 3.6
Python 3.7
PyPy3 3.5+

This package includes:

  • SSHClient - historically the first one helper, which used for SSH connections and requires memorization due to impossibility of connection close prediction. Several API calls for sFTP also presents.

  • SSHAuth - class for credentials storage. SSHClient does not store credentials as-is, but uses SSHAuth for it. Objects of this class can be copied between ssh connection objects, also it used for execute_through_host.

  • Subprocess - subprocess.Popen wrapper with timeouts, polling and almost the same API, as SSHClient (except specific flags, like cwd for subprocess and get_tty for ssh).

  • async_api.Subprocess - the same, as Subprocess helper, but works with asyncio. .. note:: for Windows ProactorEventLoop or another non-standard event loop should be used!

  • ExecResult - class for execution results storage. Contains exit code, stdout, stderr and getters for decoding as JSON, YAML, string, bytearray and brief strings (up to 7 lines).

  • ExitCodes - enumerator for standard Linux exit codes. BASH return codes (broduced from signal codes) also available.

Usage

SSHClient

Basic initialization of SSHClient can be done without construction of specific objects:

client = exec_helpers.SSHClient(host, username="username", password="password")

If ssh agent is running - keys will be collected by paramiko automatically, but if keys are in specific location - it should be loaded manually and provided as iterable object of paramiko.RSAKey.

For advanced cases or re-use of credentials, SSHAuth object should be used. It can be collected from connection object via property auth.

Creation from scratch:

auth = exec_helpers.SSHAuth(
    username='username',  # type: typing.Optional[str]
    password='password',  # type: typing.Optional[str]
    key=None,  # type: typing.Optional[paramiko.RSAKey]
    keys=None,  # type: typing.Optional[typing.Iterable[paramiko.RSAKey]],
    key_filename=None,  # type: typing.Union[typing.List[str], str, None]
    passphrase=None,  # type: typing.Optional[str]
)

Key is a main connection key (always tried first) and keys are alternate keys. Key filename is afilename or list of filenames with keys, which should be loaded. Passphrase is an alternate password for keys, if it differs from main password. If main key now correct for username - alternate keys tried, if correct key found - it became main. If no working key - password is used and None is set as main key.

Context manager is available, connection is closed and lock is released on exit from context.

Subprocess

No initialization required. Context manager is available, subprocess is killed and lock is released on exit from context.

Base methods

Main methods are execute, check_call and check_stderr for simple executing, executing and checking return code and executing, checking return code and checking for empty stderr output. This methods are almost the same for SSHCleint and Subprocess, except specific flags.

result = helper.execute(
    command,  # type: str
    verbose=False,  # type: bool
    timeout=1 * 60 * 60,  # type: typing.Union[int, float, None]
    **kwargs
)
result = helper.check_call(
    command,  # type: str
    verbose=False,  # type: bool
    timeout=1 * 60 * 60,  # type: type: typing.Union[int, float, None]
    error_info=None,  # type: typing.Optional[str]
    expected=None,  # type: typing.Optional[typing.Iterable[int]]
    raise_on_err=True,  # type: bool
    # Keyword only:
    exception_class=CalledProcessError,  # typing.Type[CalledProcessError]
    **kwargs
)
result = helper.check_stderr(
    command,  # type: str
    verbose=False,  # type: bool
    timeout=1 * 60 * 60,  # type: type: typing.Union[int, float, None]
    error_info=None,  # type: typing.Optional[str]
    raise_on_err=True,  # type: bool
    # Keyword only:
    expected=None,  # typing.Optional[typing.Iterable[typing.Union[int, ExitCodes]]]
    exception_class=CalledProcessError,  # typing.Type[CalledProcessError]
)
result = helper(  # Lazy way: instances are callable and uses `execute`.
    command,  # type: str
    verbose=False,  # type: bool
    timeout=1 * 60 * 60,  # type: typing.Union[int, float, None]
    **kwargs
)

If no STDOUT or STDERR required, it is possible to disable this FIFO pipes via **kwargs with flags open_stdout=False and open_stderr=False.

The next command level uses lower level and kwargs are forwarded, so expected exit codes are forwarded from check_stderr. Implementation specific flags are always set via kwargs.

If required to mask part of command from logging, log_mask_re attribute can be set global over instance or providden with command. All regex matched groups will be replaced by ‘<*masked*>’.

result = helper.execute(
    command="AUTH='top_secret_key'; run command",  # type: str
    verbose=False,  # type: bool
    timeout=1 * 60 * 60,  # type: typing.Optional[int]
    log_mask_re=r"AUTH\s*=\s*'(\w+)'"  # type: typing.Optional[str]
)

result.cmd will be equal to AUTH=’<*masked*>’; run command

ExecResult

Execution result object has a set of useful properties:

  • cmd - Command

  • exit_code - Command return code. If possible to decode using enumerators for Linux -> it used.

  • stdin -> str. Text representation of stdin.

  • stdout -> typing.Tuple[bytes]. Raw stdout output.

  • stderr -> typing.Tuple[bytes]. Raw stderr output.

  • stdout_bin -> bytearray. Binary stdout output.

  • stderr_bin -> bytearray. Binary stderr output.

  • stdout_str -> str. Text representation of output.

  • stderr_str -> str. Text representation of output.

  • stdout_brief -> str. Up to 7 lines from stdout (3 first and 3 last if >7 lines).

  • stderr_brief -> str. Up to 7 lines from stderr (3 first and 3 last if >7 lines).

  • stdout_json - STDOUT decoded as JSON.

  • stdout_yaml - STDOUT decoded as YAML.

  • timestamp -> typing.Optional(datetime.datetime). Timestamp for received exit code.

SSHClient specific

SSHClient commands support get_pty flag, which enables PTY open on remote side. PTY width and height can be set via keyword arguments, dimensions in pixels are always 0x0.

Possible to call commands in parallel on multiple hosts if it’s not produce huge output:

results = SSHClient.execute_together(
    remotes,  # type: typing.Iterable[SSHClient]
    command,  # type: str
    timeout=1 * 60 * 60,  # type: type: typing.Union[int, float, None]
    expected=None,  # type: typing.Optional[typing.Iterable[int]]
    raise_on_err=True,  # type: bool
    # Keyword only:
    exception_class=ParallelCallProcessError  # typing.Type[ParallelCallProcessError]
)
results  # type: typing.Dict[typing.Tuple[str, int], exec_result.ExecResult]

Results is a dict with keys = (hostname, port) and and results in values. By default execute_together raises exception if unexpected return code on any remote.

For execute through SSH host can be used execute_through_host method:

result = client.execute_through_host(
    hostname,  # type: str
    command,  # type: str
    auth=None,  # type: typing.Optional[SSHAuth]
    target_port=22,  # type: int
    timeout=1 * 60 * 60,  # type: type: typing.Union[int, float, None]
    verbose=False,  # type: bool
    # Keyword only:
    get_pty=False,  # type: bool
    width=80,  # type: int
    height=24  # type: int
)

Where hostname is a target hostname, auth is an alternate credentials for target host.

SSH client implements fast sudo support via context manager: Commands will be run with sudo enforced independently from client settings for normal usage:

with client.sudo(enforce=True):
    ...

Commands will be run without sudo independently from client settings for normal usage:

with client.sudo(enforce=False):
    ...

“Permanent client setting”:

client.sudo_mode = mode  # where mode is True or False

SSH Client supports sFTP for working with remote files:

with client.open(path, mode='r') as f:
    ...

For fast remote paths checks available methods:

  • exists(path) -> bool

>>> conn.exists('/etc/passwd')
True
  • stat(path) -> paramiko.sftp_attr.SFTPAttributes

>>> conn.stat('/etc/passwd')
<SFTPAttributes: [ size=1882 uid=0 gid=0 mode=0o100644 atime=1521618061 mtime=1449733241 ]>
>>> str(conn.stat('/etc/passwd'))
'-rw-r--r--   1 0        0            1882 10 Dec 2015  ?'
  • isfile(path) -> bool

>>> conn.isfile('/etc/passwd')
True
  • isdir(path) -> bool

>>> conn.isdir('/etc/passwd')
False

Additional (non-standard) helpers:

  • mkdir(path: str) - execute mkdir -p path

  • rm_rf(path: str) - execute rm -rf path

  • upload(source: str, target: str) - upload file or from source to target using sFTP.

  • download(destination: str, target: str) - download file from target to destination using sFTP.

Subprocess specific

Keyword arguments:

  • cwd - working directory.

  • env - environment variables dict.

async_api.Subprocess specific

All standard methods are coroutines. Async context manager also available.

Example:

async with helper:
  result = await helper.execute(
      command,  # type: str
      verbose=False,  # type: bool
      timeout=1 * 60 * 60,  # type: typing.Union[int, float, None]
      **kwargs
  )

Testing

The main test mechanism for the package exec-helpers is using tox. Available environments can be collected via tox -l

CI systems

For code checking several CI systems is used in parallel:

  1. Travis CI: is used for checking: PEP8, pylint, bandit, installation possibility and unit tests. Also it’s publishes coverage on coveralls.

  2. Azure Pipelines: is used for windows compatibility checking.

  3. coveralls: is used for coverage display.

Project details


Release history Release notifications | RSS feed

This version

3.3.2

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

exec-helpers-3.3.2.tar.gz (73.2 kB view details)

Uploaded Source

Built Distributions

exec_helpers-3.3.2-py3-none-any.whl (46.4 kB view details)

Uploaded Python 3

exec_helpers-3.3.2-cp37-cp37m-win_amd64.whl (719.9 kB view details)

Uploaded CPython 3.7m Windows x86-64

exec_helpers-3.3.2-cp37-cp37m-win32.whl (623.0 kB view details)

Uploaded CPython 3.7m Windows x86

exec_helpers-3.3.2-cp37-cp37m-manylinux1_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.7m

exec_helpers-3.3.2-cp37-cp37m-manylinux1_i686.whl (2.7 MB view details)

Uploaded CPython 3.7m

exec_helpers-3.3.2-cp36-cp36m-win_amd64.whl (719.0 kB view details)

Uploaded CPython 3.6m Windows x86-64

exec_helpers-3.3.2-cp36-cp36m-win32.whl (622.6 kB view details)

Uploaded CPython 3.6m Windows x86

exec_helpers-3.3.2-cp36-cp36m-manylinux1_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.6m

exec_helpers-3.3.2-cp36-cp36m-manylinux1_i686.whl (2.8 MB view details)

Uploaded CPython 3.6m

exec_helpers-3.3.2-cp35-cp35m-win_amd64.whl (670.2 kB view details)

Uploaded CPython 3.5m Windows x86-64

exec_helpers-3.3.2-cp35-cp35m-win32.whl (575.2 kB view details)

Uploaded CPython 3.5m Windows x86

exec_helpers-3.3.2-cp35-cp35m-manylinux1_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.5m

exec_helpers-3.3.2-cp35-cp35m-manylinux1_i686.whl (2.6 MB view details)

Uploaded CPython 3.5m

File details

Details for the file exec-helpers-3.3.2.tar.gz.

File metadata

  • Download URL: exec-helpers-3.3.2.tar.gz
  • Upload date:
  • Size: 73.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec-helpers-3.3.2.tar.gz
Algorithm Hash digest
SHA256 a9cf3b73ae3ee8845041704c61e75c2d29f2dbda44aa15768074a8cba65527a1
MD5 f030884930c8df3edf40986d74149ba5
BLAKE2b-256 00657a694d2a9644631a6c5d75e457888d6976cac0501772cab1861c692317e1

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-py3-none-any.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-py3-none-any.whl
  • Upload date:
  • Size: 46.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec_helpers-3.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 2ee28d19512a366eb2e8824f176bf2bb4dd19e5ef5f414051f35f83a9017a79e
MD5 d1a9f7b7d4e2ae6daefe15d9ea526ff3
BLAKE2b-256 ee40572dd5b2ddbf8ca8686801d2727057a1cd4a0b10c81b171a1cf3d6f1879d

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 719.9 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.0

File hashes

Hashes for exec_helpers-3.3.2-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 e60f92e13299e6e53c1f7a7964bd191ab82e9f2fd237de24e3af2d051f434a0e
MD5 6a723950ae919b66fe5c98b182b36796
BLAKE2b-256 f5f8e7aa65c9b45879e3db9f457cf485c7959dd4f157ee721dbd56ebaf1eb2a4

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp37-cp37m-win32.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 623.0 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.0

File hashes

Hashes for exec_helpers-3.3.2-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 29f542aeffb48c977573d9a9f817ba305531fa16c240b433144cff9dcc166ccc
MD5 4af9c6d39590ae18e4d17d494c41b8a0
BLAKE2b-256 1a4f00b557d33c3ec830adda4312e986edfb7d87764d1c08686627129a1ac90b

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 3.0 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec_helpers-3.3.2-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 65b4ef5bb42ecb4a87d279f812513865843499f2429dda99361d3cd1683ba332
MD5 e41d755ac2793ee6813afd761e943062
BLAKE2b-256 670bdd9051d6bcf5db644aa2c3b5c7ef39bdb9b86886a14851dec55749d4b57b

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp37-cp37m-manylinux1_i686.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 2.7 MB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec_helpers-3.3.2-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 5c0c95de193f88bdb63c8cb73754e032a0ff605d2d881bbacd1d963e4f925021
MD5 42b5aa045f4a177dc99fb4048f3af36c
BLAKE2b-256 f55a7edcd241857435372f7159f164d57e483b9ca7a6b8d97720f74211a754fb

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 719.0 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.4

File hashes

Hashes for exec_helpers-3.3.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 4d3c1a19604aee5520ef6efe168e437ed07a0e7c37fbe1e40868024613a6c76a
MD5 c8975a103b925616c1495241f9f809ea
BLAKE2b-256 8c2a585e5116c97f0c778c71c3483577648531a019d864dc3b2c0e6145a1c45f

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp36-cp36m-win32.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 622.6 kB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.6.4

File hashes

Hashes for exec_helpers-3.3.2-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 0048f9a105c1754d59dd65c83e7a4c0c92f0f44eeb2d4fa2f25d315d7def8b44
MD5 b465835ea49d5fae4a240cadbeefd0d3
BLAKE2b-256 0af22b1d4bbedeefc9071478535f013d2ae54e6c5ee853cab1b0553ce57f951d

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 3.0 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec_helpers-3.3.2-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0eda0620e2de99f6b2dcb20b5c635253ad5760c8bbef913d0571ef0da2d56abf
MD5 dc4537cccf14d205e7ba2449764e5627
BLAKE2b-256 a45e194884f43ec834773c70c6cdeba547f3d223b1162dc0a2113210523dd75b

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp36-cp36m-manylinux1_i686.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 2.8 MB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec_helpers-3.3.2-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 99b50fefd253c5ca86fea1fddcfb1e0a733815213664e69e589c0697163ee740
MD5 7cb5cca6cb1491f2345ea95b6a12e980
BLAKE2b-256 acbe6d52531df4ab317e7c6a9a551df9227c59a5f674598a6b5db58e9649ebeb

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 670.2 kB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.5.4

File hashes

Hashes for exec_helpers-3.3.2-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 8d5f5f2f4a83857cbc058c44609e2eca14e4abc2a24c5f442a53e1d940771420
MD5 04286c2daa48ff87d66a5d15ce82b88e
BLAKE2b-256 c2ecb3ac9be3f2efeced64d6cab29f738ae6a29e190f3d3fd143db99001d9acd

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp35-cp35m-win32.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp35-cp35m-win32.whl
  • Upload date:
  • Size: 575.2 kB
  • Tags: CPython 3.5m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.5.4

File hashes

Hashes for exec_helpers-3.3.2-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 1b4c661103926f53373979aafcf59d76f189d6458ca66745858dbdb2ffed931d
MD5 9bca20bc4afef27b044fbb6bdffcf747
BLAKE2b-256 f86fc9909a8541c13387f68cd11b17fdc9fd333ab191df73808f9c921c80ff32

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp35-cp35m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 2.9 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec_helpers-3.3.2-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 0b191cbae5d9fd62779f8907bb34f909a55aab57f2d6ad6c0560c355eb7716c7
MD5 76c0fe3572fa832d609cbef7e0ec8d81
BLAKE2b-256 74567c2443f93cc497e3bc693c1277ba9d25db4e070144bfd6fab401f1b954ad

See more details on using hashes here.

File details

Details for the file exec_helpers-3.3.2-cp35-cp35m-manylinux1_i686.whl.

File metadata

  • Download URL: exec_helpers-3.3.2-cp35-cp35m-manylinux1_i686.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.20.1 setuptools/40.6.2 requests-toolbelt/0.8.0 tqdm/4.28.1 PyPy/5.10.1

File hashes

Hashes for exec_helpers-3.3.2-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 a40a7f4fc71cba6205e507686c2690a4dcd975788a4423721236bff9752eb20e
MD5 a8157a4e66ce81c10b043970941bb9c9
BLAKE2b-256 52052f607cd105206904a12c17031c9a2d8f38470974d3f5c44c584ed542e357

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page