1
1

そうだ、Pythonで、OS的な、なにかを作ろう。

Dレベルです.

その①~どんなやつか、最後にどうなるか。

最後にどうなるかを説明します。

なんで、思いついたか

ubontu弄りながら、遊んでるときにCで作ろうと思ったけどC難しいからpython...pythonをCにへんかんすれば....

最終形態.

Python shell
画像を見れば、わかりますが、
lsや、cdなどのbashコマンドを実装しています。
basic <basicコードの書かれたファイル>で、BASICを実行できるようにしました。
ちなみに、BASICのGOTOは、なぜか、無理で、10 20 30の書き方をすると無言の圧が来ました。

きちんと、コマンド入力で、フォルダの位置も表示できます。
何もなしで、エンターを送信しても、bashが動作します。
では、最初に実際に書いたものを見てください(repl.itで、開発をしました。)
コードを見てもらいます.
なぜか、コードがバグるので、repl.itのURLを書きます。

みると、 コメントもなくクソコードです。

各自、適度に読み解いてください。
これをCに変換したりして、OSとして使えるようにします。
各自面白がって使ってみてください。
ウィンドウを追加して、Browserを......
(兄が、Discord出来ないじゃんとうるさいから いいやろ、basic出来るんだから)

解説(?)

解説的な、なにか。
まず、shファイルについて、
shファイルは、適当に実行手順を書きます。
名前は、なんでもいいですが、stratようなので、strat.shとします。

echo Strat <ソフト名> strat script
echo "\$0 strat-script name: $0" #書いてるshファイルを出力します。
echo name enter plese #shのreadが、input:("msg")みたいに出来ないから。
read NAME #名前を聞く
echo "Hello, $NAME!" #ようこそ!的な
echo Start package installation #Packageをインストールするよー的な
pip install -r requirements.txt #Packageをインストで、時間を使いそれっぽく仕上げる.
echo Done package install
echo ~~~~~~~~~~~~~~~~~~~~~~
echo name:<ソフト名> #書かなくてもいいけど、OSとしてなら建前だけでも
echo authors : <開発者名>
echo strat <ソフト名>!
echo ~~~~~~~~~~~~~~~~~~~~~~
python shell.py #shell実行

こんな感じです。
shellを書いたファイルとrequirements.txtを実行する内容が書いて有ればいいです。

shellのファイル

shell.pyとします。
まず最初に書きます。

import os

class BasicInterpreter:
    def __init__(self):
        self.variables = {}

    def execute_line(self, line):
        line = line.strip()
        if line.startswith("PRINT "):
            print(line[6:])
        elif line.startswith("LET "):
            try:
                # Example: LET X = 10
                var, expr = line[4:].split('=')
                var = var.strip()
                expr = expr.strip()
                self.variables[var] = eval(expr, {}, self.variables)
            except Exception as e:
                print(f"Error: {e}")
        elif line.startswith("INPUT "):
            try:
                # Example: INPUT X
                var = line[6:].strip()
                self.variables[var] = input(f"{var} = ")
            except Exception as e:
                print(f"Error: {e}")
        else:
            print(f"Unsupported BASIC command: {line}")

    def run(self, filename):
        if not os.path.isfile(filename):
            print(f"File '{filename}' not found")
            return

        with open(filename, 'r') as file:
            lines = file.readlines()

        for line in lines:
            self.execute_line(line)

class SimpleShell:
    def __init__(self):
        self.current_directory = os.getcwd()
        self.basic_interpreter = BasicInterpreter()

    def cd(self, path):
        if path == "..":
            parent_directory = os.path.dirname(self.current_directory)
            if parent_directory:
                os.chdir(parent_directory)
                self.current_directory = os.getcwd()
            else:
                print("Already at the root directory")
        else:
            try:
                os.chdir(path)
                self.current_directory = os.getcwd()
            except FileNotFoundError:
                print(f"Directory '{path}' not found")
            except NotADirectoryError:
                print(f"'{path}' is not a directory")

    def mkdir(self, dir_name):
        try:
            os.mkdir(dir_name)
        except FileExistsError:
            print(f"Directory '{dir_name}' already exists")
        except FileNotFoundError:
            print(f"Cannot create directory '{dir_name}'")

    def ls(self):
        try:
            files = os.listdir(self.current_directory)
            for file in files:
                print(file)
        except FileNotFoundError:
            print(f"Directory '{self.current_directory}' not found")

    def cal(self, args):
        try:
            import calendar
            from datetime import datetime

            if not args:
                year = datetime.now().year
                month = datetime.now().month
            elif len(args) == 1:
                month = int(args[0])
                year = datetime.now().year
            elif len(args) == 2:
                month = int(args[0])
                year = int(args[1])
            else:
                print("Usage: cal [month] [year]")
                return

            cal_text = calendar.month(year, month)
            print(cal_text)
        except ValueError:
            print("Invalid month or year")

    def basic(self, args):
        if not args:
            print("Usage: basic <filename>")
            return

        filename = args[0]
        self.basic_interpreter.run(filename)

    def run(self):
        while True:
            command = input(f"{self.current_directory} >>> ")
            parts = command.split()
            if parts:
                cmd = parts[0].lower()
                args = parts[1:]

                if cmd == "exit":
                    break
                elif cmd == "cd":
                    self.cd(' '.join(args))
                elif cmd == "mkdir":
                    self.mkdir(' '.join(args))
                elif cmd == "ls":
                    self.ls()
                elif cmd == "cal":
                    self.cal(args)
                elif cmd == "basic":
                    self.basic(args)
                else:
                    print("Unknown command. Available commands: cd, mkdir, ls, cal, basic, exit")

if __name__ == "__main__":
    shell = SimpleShell()
    shell.run()

basicを実装してるのでチット長いです。
まず、コマンドを追加するのは、どうするのか、
手順は、3つ簡単です。
自分は、めんどいけど。(
1.コマンドの処理方法を実装する:
ー新しいコマンドを処理するためのメソッドをシェルクラスに追加します。
2.コマンドの解析と実行:
ーユーザーが入力したコマンドを解析し、適切なメソッドを呼び出します。
3.コマンドのテストとデバッグ:
ー新しいコマンドが正しく機能するかどうかをテストします。

試しに....
先ほど書いた、repl.itのコードをフォークして、
nshell.pyを開いてください。

class SimpleShell:
    def __init__(self):
        self.current_directory = os.getcwd()
        self.basic_interpreter = BasicInterpreter()

の下に、
cdとかいろいろかいてあります。
なのでこのclassの下に書きます。

 def date(self, args):
        now = datetime.now()
        print(now.strftime("%Y-%m-%d %H:%M:%S"))

これが、動作です。
nshell.pyから、

def run(self):
        while True:
            command = input(f"{self.current_directory} >>> ")
            parts = command.split()

を探してください。
見つけたら。

if cmd == "exit":
                    break
                elif cmd == "cd":
                    self.cd(' '.join(args))
                elif cmd == "mkdir":

などが、並んでいます。
なので、

elif cmd == "date":
                    self.date(args)

と書いてあげます。
こまんどが追加できました。
各自、適度に改造して自分独自のコマンドを追加してください。

まぁ、詳しい解説は、その②を出したときにでも...
まぁ失敗しても、乙ですし。
nshell.pyは、テスト用です。
自分がrepl.itで公開してるのは、
forkしたらshellで、chmod +x strat.shの後に./strat としてもらえれば出来ますんで
以下略 第二弾あったら、作ります。
つぎは、 Browserを....

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1