Pythonファイル内からbashコードを実行できるかどうか疑問に思っています。まったく別の bash ファイルを実行するという意味ではありません。1行以上の長さのbashコードを簡単に実行する方法を探しています。具体的には、今日以前に尋ねた質問から助けを得たこのコードを実行したいと思います。
shopt -s nullglob
dirs=(*/)
cd -- "${dirs[RANDOM%${#dirs[@]}]}"
文字列をsh
スクリプトとして実行するには (POSIX を想定):
#!/usr/bin/env python
from subprocess import check_call as x
x("""pwd
cd /
pwd""", shell=True)
コマンドを明示的に指定できます。
x(["bash", "-c", '''shopt -s nullglob
dirs=(*/)
pwd
cd -- "${dirs[RANDOM%${#dirs[@]}]}"
pwd'''])
cd
注:ランダムなサブディレクトリに移動できるかどうかのみをチェックします。変更は、bash スクリプトの外部では表示されません。
あなたはbashなしでそれを行うことができます:
#!/usr/bin/env python
import os
import random
print(os.getcwd())
os.chdir(random.choice([d for d in os.listdir(os.curdir) if os.path.isdir(d)]))
print(os.getcwd())
次を使用することもできますglob
。
from glob import glob
randomdir = random.choice(glob("*/"))
との違いは、ドットで始まるディレクトリをフィルタリングすることos.listdir()
です。手動でフィルタリングできます:glob()
.
randomdir = random.choice([d for d in os.listdir(os.curdir)
if (not d.startswith(".")) and os.path.isdir(d)])
bash コードを実行することはできますが、その影響 (特にcd
) はそれが実行されるサブプロセスにのみ影響するため、意味がありません。むしろ、これはすべて Python コマンドで完全に実行できます ( を参照してくださいglob
)。
パラメータを true に設定して、 subprocessモジュールos.system
の or 関数を使用できます。shell
プラットフォームの独立性を維持しながら、bash で行うことの多くは Python 内でも同じように簡単に行うことができることに注意してください。たとえば、最近 Windows で Python スクリプトを実行しようとしましたが、これは多くの UNIX コマンドを使用してテキストの grep などの単純なことを行っていたため、失敗しました。
これを行うこともできます。
import os
os.system("system call 1")
os.system("system call 2")
(etc)
この方法でシェル スクリプトを記述し、Python の (より優れた) ループ機能と条件付き実行機能を使用できます。
最良の方法は、コマンドモジュールを使用することです
例えば:
>>> import commands
>>> (status,output)=commands.getstatusoutput("ls")
>>> print(output)#print the output
>>> print(status)#print the status of executed command