Итак, я создаю своего рода учебную программу из командной строки в Python. По сути, он эмулирует терминал и проводит вас по разным уровням с помощью команд оболочки. Исходная версия работала так: я поймал что-то введенное и проанализировал это на предмет вызовов обучающей программы, если их не было, я передал команду компьютеру с помощью os.system ().
К сожалению, поскольку я написал учебник для системы * nix, он не работает на Windows, так как я включил уровни с использованием vim и еще чего-то. Я планировал переписать программу, но вместо того, чтобы делать вызовы системе, я создал виртуальную файловую систему. Сюда входят объекты: каталог и файл. Вероятно, вы сможете понять, чем должны быть оба объекта. Объект каталога будет содержать список своего содержимого, и он будет действовать как файловая система. Затем я бы реализовал такие команды, как cd, ls, pwd и т. Д.
Проблема, с которой я столкнулся, заключается в том, что когда я возвращаю содержащий каталог или файл из объекта каталога, я не могу редактировать любым способом. Я приведу вам пример своего кода.
ПРИМЕЧАНИЕ. В коде, вероятно, есть ошибки, поскольку я не могу хорошо его протестировать, не исправив эту проблему. Кроме того, импорт не требуется для проблемы. Первый - это цветовой класс, который устанавливает коды для цветного вывода, а второй - это файл, содержащий глобальные переменные. Я удалил вызовы этих ресурсов, чтобы он работал в чужой системе
#from ..resources.colors import colors
#from ..resources import variables as var
class Directory:
# Basic constructor
def __init__(self, name="", container=None, contents=[]):
self.name = name
self.container = container
self.contents = contents
# grabs index of contents by name
def index(self, find):
for i in range(len(self.contents)):
if self.contents[i].name == find:
return i
return -1
# Add something to the container
def add(self, dirFile):
# Check for duplicate names
if self.index(dirFile.name) != -1:
return False
self.contents.append(dirFile)
return True
# Retrieve something that's in contents
def get(self, neededName):
ind = self.index(neededName)
if ind >= 0:
return self.contents[ind]
# Returns true if it has at least one sub directory
def has_sub(self):
for content in self.contents:
if type(content) == Directory:
return True
return False
# Iterates through, looks for slashes and goes to subs (recursion, ooooh!)
def get_sub(self, path=""):
if not self.has_sub() or path == "":
return self
pathSplit = path.split("/")
nextDir = self.index(pathSplit[0])
if nextDir >= 0:
return self.contents[nextDir]
pathSplit.pop(0)
path = "/".join(pathSplit)
return self.get_sub(path)
# ============== Shell Commands ==============
# List all contents in directory
def ls(self):
for content in self.contents:
if type(content) == Directory:
#print(colors.fg.blue + content.name + colors.reset + "\t", end="") This is the code wih the colors class
print(content.name + "\t", end="")
else:
print(content.name + "\t", end="")
print()
# Delete file by name:
def rm(self, toDelete):
ind = self.index(toDelete)
if ind >= 0:
self.contents.pop(ind)
return True
else:
return False
# Make new dir
def mkdir(self, name=""):
if name:
self.add(Directory(name))
## Current test
di = Directory("Test")
di.mkdir("one")
di.mkdir("two")
di.get_sub("one").mkdir("test")
di.ls()
di.get_sub("one").ls()
Текущий вывод:
one two test
one two test
Но вывод должен быть таким:
one two
test
По какой-то причине, когда я звоню:
di.get_sub("one").mkdir("test")
Он меняет di, а не объект, возвращаемый get_sub ()
Любая помощь очень приветствуется! Дайте мне знать, если мне нужно что-нибудь еще.