2017/06/14

Pythonでシェルコマンドを実行してみたかったから

PythonからCGIとしての応答の内容として「 ls 」とかのコマンドを実行してみたかったので、
いろいろ調べてみました。

最終的に対象ディレクトリをlsコマンドを使ってファイル一覧を取得して、
ファイルのリストを返してくれるCGIを作ってみました。
(CGIのテストにいちいちURL打つのがめんどくさかったのさ・・・。いくら履歴があるとはいえ)
思ったよりも便利でラッキーでした。

さてコードです。


コード[Python]


#!/usr/bin/python
# -*- coding: utf-8 -*-

from os import environ
import cgi
import subprocess


#対象ディレクトリのファイルへのリンク作成関数
#引数
#targetdir
#    [string]リンクを作成したいディレクトリへのcgi-binからの相対パス。
def LinkGet( targetdir ):

        #実行コマンド作成
        Command = "ls -F " + targetdir + " | grep -v / |rev | cut -c 2- |rev"

        #返り値
        OutputText = "<div>\n<h3>" + targetdir + "</h3>\n<ul>\n"


        #対象ターゲットに対してlsコマンドを実行
        CommandResult = subprocess.check_output(Command,shell=True )

        #個別のファイル名称に分割
        ResultSplitArr = CommandResult.split("\n")

        for ResultCell in ResultSplitArr:
                if ResultCell!="":
                        OutputText += "<li><a href=\"" + targetdir \
                                      + "/" + ResultCell + "\">" + ResultCell \
                                      + "</a></li>\n";

        OutputText += "</ul>\n</div>\n"
        return OutputText

#ファイルリストの作成対象
TargetList = [".","../html"]

#出力用のHTML
ResultHTML = ""

#リスト取得処理
for TargetCell in TargetList:
        ResultHTML += LinkGet(TargetCell)

html = '''Content-Type: text/html

<html>
<head>
  <title>Contents_List</title>
</head>
<body>
<div>'''
print html;

print ResultHTML;

html ='''</div>
</body>
</html>'''
print html;


以下、解説です。
pythonからシェルコマンドを使うときは subprocess をimportして
subprocess.check_output( [コマンド文字列], shell=True)
を書きます。
これでシェルコマンドの出力結果は帰ってくるので、「.split()」で分解してhtml文字列に変換します。

CGIの実行ディレクトリはcgi-binなので
lsをほかのフォルダに実行するときは、cgi-binからの相対パスで設定します。

出力結果

上記のコードを記述したCGIにアクセスしてみます。

表示できました。
これで作ったCGIやhtmlコンテンツへのアクセスが簡単になりました。

ご参考になれば幸いです。

0 件のコメント:

コメントを投稿

AWSに手を出してフレームワークも使ってみたが・・・。

サイトを作り直しました。 AWS上に構築した Content created by AXY を作り直しました。 具体的にはbottle.pyを使ったpythonで構築したサイトからPHP7を使用したサイトに再構築しています。 特別何か問題点があったというわけで...