そうだ、Pythonで、OS的な、なにかを作ろう。
Dレベルです.
その①~どんなやつか、最後にどうなるか。
最後にどうなるかを説明します。
なんで、思いついたか
ubontu弄りながら、遊んでるときにCで作ろうと思ったけどC難しいからpython...pythonをCにへんかんすれば....
最終形態.
画像を見れば、わかりますが、
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を....