107 lines
3.4 KiB
Plaintext
107 lines
3.4 KiB
Plaintext
Metadata-Version: 2.1
|
|
Name: shellingham
|
|
Version: 1.5.4
|
|
Summary: Tool to Detect Surrounding Shell
|
|
Home-page: https://github.com/sarugaku/shellingham
|
|
Author: Tzu-ping Chung
|
|
Author-email: uranusjr@gmail.com
|
|
License: ISC License
|
|
Keywords: shell
|
|
Classifier: Development Status :: 3 - Alpha
|
|
Classifier: Environment :: Console
|
|
Classifier: Intended Audience :: Developers
|
|
Classifier: License :: OSI Approved :: ISC License (ISCL)
|
|
Classifier: Operating System :: OS Independent
|
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
Classifier: Programming Language :: Python :: 3.7
|
|
Classifier: Programming Language :: Python :: 3.8
|
|
Classifier: Programming Language :: Python :: 3.9
|
|
Classifier: Programming Language :: Python :: 3.10
|
|
Classifier: Programming Language :: Python :: 3.11
|
|
Classifier: Programming Language :: Python :: 3.12
|
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
Requires-Python: >=3.7
|
|
Description-Content-Type: text/x-rst
|
|
License-File: LICENSE
|
|
|
|
=============================================
|
|
Shellingham: Tool to Detect Surrounding Shell
|
|
=============================================
|
|
|
|
.. image:: https://img.shields.io/pypi/v/shellingham.svg
|
|
:target: https://pypi.org/project/shellingham/
|
|
|
|
Shellingham detects what shell the current Python executable is running in.
|
|
|
|
|
|
Usage
|
|
=====
|
|
|
|
.. code-block:: python
|
|
|
|
>>> import shellingham
|
|
>>> shellingham.detect_shell()
|
|
('bash', '/bin/bash')
|
|
|
|
``detect_shell`` pokes around the process's running environment to determine
|
|
what shell it is run in. It returns a 2-tuple:
|
|
|
|
* The shell name, always lowercased.
|
|
* The command used to run the shell.
|
|
|
|
``ShellDetectionFailure`` is raised if ``detect_shell`` fails to detect the
|
|
surrounding shell.
|
|
|
|
|
|
Notes
|
|
=====
|
|
|
|
* The shell name is always lowercased.
|
|
* On Windows, the shell name is the name of the executable, minus the file
|
|
extension.
|
|
|
|
|
|
Notes for Application Developers
|
|
================================
|
|
|
|
Remember, your application's user is not necessarily using a shell.
|
|
Shellingham raises ``ShellDetectionFailure`` if there is no shell to detect,
|
|
but *your application should almost never do this to your user*.
|
|
|
|
A practical approach to this is to wrap ``detect_shell`` in a try block, and
|
|
provide a sane default on failure
|
|
|
|
.. code-block:: python
|
|
|
|
try:
|
|
shell = shellingham.detect_shell()
|
|
except shellingham.ShellDetectionFailure:
|
|
shell = provide_default()
|
|
|
|
|
|
There are a few choices for you to choose from.
|
|
|
|
* The POSIX standard mandates the environment variable ``SHELL`` to refer to
|
|
"the user's preferred command language interpreter". This is always available
|
|
(even if the user is not in an interactive session), and likely the correct
|
|
choice to launch an interactive sub-shell with.
|
|
* A command ``sh`` is almost guaranteed to exist, likely at ``/bin/sh``, since
|
|
several POSIX tools rely on it. This should be suitable if you want to run a
|
|
(possibly non-interactive) script.
|
|
* All versions of DOS and Windows have an environment variable ``COMSPEC``.
|
|
This can always be used to launch a usable command prompt (e.g. `cmd.exe` on
|
|
Windows).
|
|
|
|
Here's a simple implementation to provide a default shell
|
|
|
|
.. code-block:: python
|
|
|
|
import os
|
|
|
|
def provide_default():
|
|
if os.name == 'posix':
|
|
return os.environ['SHELL']
|
|
elif os.name == 'nt':
|
|
return os.environ['COMSPEC']
|
|
raise NotImplementedError(f'OS {os.name!r} support not available')
|