Skip to main content

Run command with a certain environment.

Project description

License PyPI version PyPI - Python Version Ruff Checked with mypy Github Actions Build Code Coverage

execenv

Powered by click, execenv is a simple cross-platform cli utility that allows you to execute commands with different environment variables by passing directly or loading from a .env file.

Preview

Thanks to rich-click, it also supports rich output for a better user experience:

Preview (rich)

Installation

With pipx

[!NOTE] pipx is a specialized package installer. It can only be used to install packages with cli entrypoints and help you to isolate the environment of each package.

Check out the official documentation to gain more insights.

As a cli application, it is recommended to install execenv via pipx:

pipx install execenv

To enable rich output, use

pipx install execenv[rich]

With pip

Alternatively, you can install execenv via pip:

pip install execenv

# Or with rich output
pip install execenv[rich]

From Source

You might also want to install execenv from source.

This project uses poetry for dependency management. Make sure you have it installed before proceeding.

git clone https://github.com/zyf722/execenv.git
cd execenv/

poetry lock
poetry install

After that, you can run the application with:

poetry run execenv

Usage

This package contains three cli applications:

  • execenv: The main application.
  • execenv-completion: A completion utility to generate completion scripts for other shells.
  • execenv-echo: A simple application for testing, which prints out K-V pairs of all given environment variables.

Basic Usage

-e / --env

To run command with specific environment variables, you can pass them directly using the -e / --env flag:

execenv -e SHELL overwritten -e KEY VAL -- execenv-echo SHELL KEY

# Or put command before options
execenv execenv-echo SHELL KEY -e SHELL overwritten -e KEY VAL

# Output
# SHELL=overwritten
# KEY=VAL

-f / --file

Or you can load K-V pairs from a .env file (dotenv compatible syntax) using the -f / --file flag:

execenv -f .env -- execenv-echo KEY

# Output
# KEY=VAL

-c / --clear

By default, current environment variables will be preserved. You can override this behavior by using the -c / --clear flag:

execenv -c -- set

# Output differs on different platforms
#
# Note that for Windows with Python 3.10 and earlier,
# this command might not work as expected with an error with `CreateProcess`
# Check python/cpython#105436 for further information 

[!NOTE] The apply order of environment variables is as follows:

  • Existing environment variables, if not cleared with -c / --clear flags
  • Variables loaded from .env file with -f / --file flags
  • -e / --env flags

Variables with the same key will be overwritten by the latter ones.

For those on the same level, the order of appearance in the command line will be followed.

-a / --append-env & --append-separator

Use -a / --append-env to append value to variables instead of overwriting:

execenv -e KEY VAL -a KEY test -- execenv-echo KEY

# Output
# KEY=VAL;test (on Windows)
# KEY=VAL:test (on Linux / macOS)

# Also works with existing ones
execenv -a PATH test -- execenv-echo PATH

# Output
# PATH=%PATH%;test (on Windows)
# PATH=$PATH:test (on Linux / macOS)

By default os.pathsep is used as the separator when appending. You can change it by using --append-separator flag:

execenv --append-separator . -a KEY test -e KEY VAL -- execenv-echo KEY

# Output
# KEY=VAL.test

[!WARNING] Be cautious when setting the separator to special characters like | with -s / --shell flag, as they might be misinterpreted by the shell, or even lead to security vulnerabilities.

Shell Related

-s / --shell

Use -s / --shell to set shell=True to subprocess in order to use expansion, built-in commands, pipes, redirection and other shell features:

# Linux / macOS
execenv -e PATH overwritten -e KEY VAL -s -- echo EXECENV_PATH \$KEY

# Windows
execenv -e PATH overwritten -e KEY VAL -s -- echo EXECENV_PATH %KEY%

# Output
# overwritten VAL

[!TIP] You should escape $ on Linux / macOS using \ and % on Windows using ^ to prevent them from being expanded by the shell if you want to use new values set with execenv.

Alternatively, you can use a prefix to access them. By default, EXECENV_ is used as the prefix. You can change it by using --env-varref-prefix flag.

[!WARNING] You should be cautious when using shell=True as it might lead to security vulnerabilities. Make sure you trust the input and the command you are running.

On POSIX platforms, due to features like expansion can not work with shlex.join as they are escaped for security reasons, internally subprocess.list2cmdline is used by default, which is less secure and compatible with POSIX. You can change it by using --shell-strict flag to switch back to shlex.join.

-C / --cwd

Use -C / --cwd to set the working directory, and note that -s / --shell is not mandatory to use this option:

# Linux / macOS
execenv -C /home -- pwd

# Windows
execenv -C C:\ -s -- echo EXECENV_CD

# Output
# C:\ (on Windows)
# /home (on Linux / macOS)

Miscellaneous

-h / --help

Use -h / --help to get help information:

execenv -h

# Or simply without any flags and arguments
execenv

-V / --version

Use -V / --version to get the version information.

-v / -vv / --verbose

Use -v / -vv / --verbose to enable verbose mode, which is useful for debugging:

execenv -e SHELL overwritten -e KEY VAL -v -- execenv-echo SHELL KEY

Verbose

A header section will be added to the output to show details about execenv itself. Use -vv to show more information.

--config

Use --config to load configuration from a file. Note that config file itself is a valid .env file.

Default config file will be created after the first run at ~/.execenv.env on Linux / macOS and %USERPROFILE%\.execenv.env on Windows.

Refer to execenv/config.py to see all available configuration with their default values.

Auto Completion

Click Built-in Shells (Bash 4.4+, Zsh & Fish)

For shells supported by click, execenv will automatically setup tab completion after the first run (screenshot below is for Fish):

Auto Completion (fish)

You may restart or source your shell to enable the completion.

Other Shells

A completion utility execenv-completion will also be installed with execenv. You can use it to generate completion scripts for other shells:

execenv-completion

Clink (Windows cmd)

execenv-completion provides support for clink.

Auto Completion (clink)

You can install it by running:

execenv-completion -s clink [-p /path/to/your/script]

It will create a completions directory in the specified path (or the current directory if not provided) with the completion .lua script inside.

[!NOTE] Check out related documentation of clink for more information.

Contributing

Pull Requests are welcome!

It is strongly recommended to follow the Conventional Commits specification when writing commit messages and creating pull requests.

License

MIT

Project details


Download files

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

Source Distribution

execenv-0.1.1.tar.gz (13.7 kB view details)

Uploaded Source

Built Distribution

execenv-0.1.1-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file execenv-0.1.1.tar.gz.

File metadata

  • Download URL: execenv-0.1.1.tar.gz
  • Upload date:
  • Size: 13.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.10.12 Linux/6.5.0-1025-azure

File hashes

Hashes for execenv-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6ef4d6f1c41f37cc0cc65732a175fa8f20800e91cb6e86e1d925d8b007e6f15f
MD5 a12c317ca6e99d16e2ab8293c46911fd
BLAKE2b-256 1c4ead8cc74571b74dfdbf9a71185bea55f4cf2442a32ac2ce2bb7df3a66ef2b

See more details on using hashes here.

File details

Details for the file execenv-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: execenv-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.10.12 Linux/6.5.0-1025-azure

File hashes

Hashes for execenv-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 adf1f747dfa9067f62d023add9a913c3408b551ac85e24e141996ad3339cfbd1
MD5 76bdb009addce6ade6736a1393138eb5
BLAKE2b-256 31da4f22a9d0a6e6d085cf12f7dbde860b4a08a77db6665bcf060c1a753dff8c

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