Coder Social home page Coder Social logo

bash's Introduction

bash for python

A library that enables easy running and concatenation of bash commands in python

Installation

Install using pip:

pip install bash

Usage

Run commands as you would in bash:

>>> from bash import bash
>>> bash('ls . | grep ".pyc"')
bash.pyc
tests.pyc

Chain commands for the same effect:

>>> bash('ls . ').bash('grep ".pyc"')
bash.pyc
tests.pyc

This becomes increasingly useful if you later need to reuse one such command:

>>> b = bash('ls . ')
>>> b.bash('grep ".pyc"')
bash.pyc
tests.pyc
>>> b.bash('grep ".py$')
bash.py
tests.py

Access stdout and stderr attributes:

>>> b = bash('ls tests.py')
>>> b.stdout
'tests.py\n'
>>> b.stderr
''

Get the return code generated by a command:

>>> b = bash('ls tests.py')
>>> b
tests.py
>>> b.code
0

To get a stripped, unicode string version of bash.stdout call value():

>>> b = bash('ls tests.py').value()
u'tests.py'

Motivation

I found that I was often having to write the same lines of code to handle running bash commands from python.

This provides a pip-installable, tested shortcut to writing:

from subprocess import PIPE, Popen

p = Popen(cmd, shell=True, stdout=PIPE, stdin=PIPE, stderr=PIPE)
output, err = p.communicate()

Warning

Please note that this library uses shell=True under the hood. This means that this library is NOT suitable for running untrusted commands. (See explanation)

Running the tests

Simply use a test runner.

$ nosetests

Support + Contributing

Feel free to make pull requests, or report issues via the repo:

https://github.com/alexcouper/bash

bash's People

Contributors

alexcouper avatar svisser avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

bash's Issues

can I use this in python 3

I installed this by pip install bash.
After that I can Import bash in python 2.x using from bash import bashbut not in python3.

is there a way i can use this in python3?

Thanks!

Hi,And Some Question

Hi.I'm a Noob form China,And I really want to know what does this work.With only a popen() function?
So if the computer don't have a naive bash,it will can't use this?

The 'increasingly useful' case does not work

The 'increasingly useful' case in Readme.rst seems to show when we initialize bash object, it keeps the standard output as same input for all subsequent bash function calls. But it is not the case. Instead, each bash object initialization or bash function call will update the standard output as input for next bash call in a chain fashion.

Snippet from Readme.rst:
This becomes increasingly useful if you later need to reuse one such command::

>>> b = bash('ls . ')
>>> b.bash('grep ".pyc"')
bash.pyc
tests.pyc
>>> b.bash('grep ".py$"')
bash.py
tests.py

Actual Result:

>>> b = bash('ls tmp')
>>> b
a.txt
bash.py
bash.pyc
tests.py
tests.pyc
>>> b.bash('grep ".pyc"')
bash.pyc
tests.pyc
>>> b.bash('grep ".py$"')

[Note: The output is actually empty.]

code snippet:

    def sync(self, timeout=None):
        kwargs = {'input': self.stdout}  # 2. use previous stdout as input for next run
        if timeout:
            kwargs['timeout'] = timeout
            if not SUBPROCESS_HAS_TIMEOUT:
                raise ValueError(
                    "Timeout given but subprocess doesn't support it. "
                    "Install subprocess32 and try again."
                )
        self.stdout, self.stderr = self.p.communicate(**kwargs)  # 1. update self.stdout each run

Suggestion:
Revise this case in readme.

Some commands not enter into interactive mode

Hi,
first for all, I want to say GREAT THANKS YOU for cool, simple and elegant tool!
I've been looking for a long time way to rewrite some complex bash scripts in python, but every time I frustrated due missing simple and convenient way to use something cool things from bash like pipes and other things. Code on python in this case was bloated and inconvenient to write and use.

Your tool changed the things for me! Thank you!

About issue:
Some commands working well with interactive input.
E.g. next commends working well - it stops script :

  • bash("sudo echo hello")
  • bash("ssh user@server")

But by some reason next command not enter into interactive mode:

  • bash("read answer")

In pure bash read answer working well.

I'm not strong in shell and terminal deep interaction mechanics, especially with python layer.
But I think these command use different mechanisms to enter to interactive mode.

Version of python bash package:

$ pip show bash 
Name: bash
Version: 0.6
...

License and updates

Hi Alex,

I would like to use the library in commercial settings (and I plan to extend it)
Can you please add License e.g. Apache 2.0?

Do you accept PR (it seems there are quite a lot of them submitted but not reviewed)

Thank you!

Ondra

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.