2016-05-25 7 views
0

サブプロセスクラスを使用して一連のシーケンスコマンドを実行するのは難しいですが、これはPythonプログラムがcv virtualenvのインストールを呼び出して別のpythonサブプロセスを使って1つのシェルで順次シェルコマンドを実行する

sudo pip install virtualenv virtualenvwrapper && sudo rm -rf ~/.cache/pip && export WORKON_HOME=$HOME/.virtualenvs && source /usr/local/bin/virtualenvwrapper.sh && source ~/.bashrc && mkvirtualenv cv 

は、これは私が端末から実行するコマンドstrignである(virtualenvの内で実行する必要があります)プログラムは、あなたはそれがCV仮想ENVの作成まで、順番に実行する複数のコマンドが含まれて見ることができます

端末でこれを実行すると、次のようなメッセージが返されます。

(cv) [email protected]:~$ 

私は、これまでのOpenCV

私のコードを必要とする私のPythonスクリプトを実行できることから、この次のとおりです。

from subprocess import Popen, PIPE, STDOUT 

cmd1 = 'sudo pip install virtualenv virtualenvwrapper' 
cmd2 = 'sudo rm -rf ~/.cache/pip' 
cmd3 = 'export WORKON_HOME=$HOME/.virtualenvs' 
cmd4 = 'source /usr/local/bin/virtualenvwrapper.sh' 
cmd5 = 'source ~/.bashrc' 
cmd6 = 'mkvirtualenv cv' 
cmd7 = 'cd /script path' 
cmd8 = 'python novo.py' 


final = Popen("{}; {}; {}; {}; {}; {}; {}; {}".format(cmd1, cmd2,cmd3, cmd4, cmd5, cmd6, cmd7, cmd8), shell=True, stdin=PIPE, 
     stdout=PIPE, stderr=STDOUT, close_fds=True) 

stdout, nothing = final.communicate() 
log = open('log', 'w') 
log.write(stdout) 
log.close() 

そして、このようなログを見にエラー:

/bin/sh: 1: source: not found 
/bin/sh: 1: source: not found 
/bin/sh: 1: mkvirtualenv: not found 

私はどのように実行のような端末を実現できますか? 再び、配列が重要である。

ありがとうございました。

答えて

0

/bin/sh: 1: source: not found

shell=Trueデフォルトで/bin/shを使用しています。 sourceシェルはbashでヒントを組み込みました。合格executable='/bin/bash'

#!/usr/bin/env python3 
import sys 
from subprocess import check_call, DEVNULL, STDOUT 

with open('log', 'wb', 0) as file: 
    check_call("""set -e -x 
{python} -mpip install --user virtualenv virtualenvwrapper 
rm -rf ~/.cache/pip 
export WORKON_HOME=$HOME/.virtualenvs 
source /path/to/virtualenvwrapper.sh 
source ~/.bashrc 
mkvirtualenv cv 
cd /script path 
{python} novo.py 
""".format(python=sys.executable), 
       shell=True, executable='/bin/bash', 
       stdin=DEVNULL, stdout=file, stderr=STDOUT, close_fds=True) 

または別のbashスクリプトにコマンドを保存し、代わりにスクリプトを実行します。

ところで、あなたはリテラル複数行の文字列を使用することができます。

DEVNULLはPython 3の機能です。Python 2でもそれをエミュレートするのは簡単です:DEVNULL = open(os.devnull, 'r+b', 0)

+0

Hello JF Sebastian、あなたの答えをありがとう、私はあなたが示唆したように私のpythonスクリプトのコードを変更しましたが、今私はエラー "ファイル" programa.py "行3を与える実行 サブプロセスからimport check_call、DEVNULL、STDOUT ImportError:名前DEVNULLをインポートできません " 私はこの種の操作に本当に新しく、私の知識はpythonとopencvにとどまり、この種類の呼び出しとbashファイルで正しく動作する方法はわかりません。 –

+0

私はシバンズの仕組みを本当に理解していませんが、私はpyhton2に変更しました。 'CalledProcessError'を返します。コードやエラーをチェックすることができます。http://postimg.org/image/f6dfdaucr/ –

+0

私の回答は「source:not found」の問題を修正しました。別の問題がある場合。あなたはそれを別の質問として尋ねるべきです。 – jfs

関連する問題