基于 Python 3.12.4 和 PySide 6 的 假用户操作系统【0-1-1】:完善【use...in...】和文件导入规则

上一篇文章链接:

基于 Python 3.12.4 和 PySide 6 的 假用户操作系统【0-1】定义虚拟终端 use...(in...) 导入指令-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/2402_84665876/article/details/141456640


允许文件导入方法(不能导入自己): 

    def isImportable(self, dict: str, argv: str):
        for i in self.ImportLessFile:
            if self.getstdpath(argv).strip() == i or (self.getstdpath(argv).strip() in i and self.getstdpath(dict).strip() in i):
                return False
        return True

对 self.use( ) 的修改:

    def use(self, args: list[str]):
        o_path = path.abspath(".")
        if args[1].strip() != "in":
            if not self.isImportable(self.path(), args[0]):
                print("无效导入:无法自己导入自己。"
                      f"\n\tuse {self.addlist(args, connect=" ")}"
                      f"\n\t    {"^" * len(args[0])}")
                return
                ——snip——
        else:
            if not self.isImportable(self.path(), args[2]):
                print("无效导入:无法自己导入自己。"
                      f"\n\tuse {self.addlist(args, connect=" ")}"
                      f"\n\t    {" "*len(args[0])}    {"^" * len(args[2])}")
                return
                ——snip——

完整代码:

command.py


import sys
from ctypes import windll
from typing import Tuple

from PySide6.QtWidgets import QWidget
from sys import exit as sys_exit
from os import path, chdir
from warnings import filterwarnings
from command_version import CommandVersion
from inspect import getframeinfo, currentframe


class Command:
    filedir = path.dirname(path.abspath(__file__)) + "\\"
    ImportLessFile: list[str] = [filedir + "command_while.py",
                                 filedir + "command.py"]
    def __init__(self, UI: QWidget = None):
        windll.kernel32.SetConsoleTitleW("FalseOS Command")
        filterwarnings("ignore", category=SyntaxWarning)

    def run(self, command: str):
        if command == "":
            return
        command += " "
        conlist = command.split(" ")
        if "exit" == conlist[0].strip():
            self.exit()
        elif "#" in conlist[0].strip():
            print(f"'{conlist[0].strip()}' 不是可导入的模块。")
            return
        try:
            exec(f"self.{conlist[0].strip()}(conlist[1:])")
        except:
            print(f"'{conlist[0].strip()}' 不是可导入的模块。")

    def path(self) -> str:
        return path.abspath(".")


    @staticmethod
    def exit():
        sys_exit(0)

    @staticmethod
    def getstdpath(file_path: str):
        if "/" in file_path:
            file_path = file_path.replace("/", "\\")
        if "*" in file_path:
            file_path = file_path.replace("*", " ")
        return file_path

    def getfilend(self, file_path: str) -> tuple[str, str] | tuple[str, None]:
        if "\\" in file_path or "/" in file_path:
            stdpath = self.getstdpath(file_path)
            stdpath = stdpath.split("\\")
            stdname = stdpath[-1]
            stddict = self.addlist(stdpath[:len(stdpath) - 1], connect="\\")
            return stdname, stddict
        else:
            return file_path, None



    @staticmethod
    def about(args):
        print(f"应用程序名称:{CommandVersion.name}\n"
              f"应用程序版本:{CommandVersion.version}\n"
              f"应用程序内部版本:{CommandVersion.build_ver}\n"
              f"应用程序证书发行机构:{CommandVersion.creater}")

    def cwd(self, args: list[str]):
        args0 = args[0]
        try:
            try:
                args0 = args[0].replace("*", " ")
            except:
                args0 = args[0]
            try:
                args0 = args0.replace("/", "\\")
            except:
                pass
            chdir(args0)
            sys.path.clear()
            sys.path.append(args0)
        except:
            if not self.is_non_str(args0):
                print(f"指定的路径无效:\n\tcwd {self.addlist(args, connect=" ")}\n\t    {"^" * len(args0)}")
            else:
                print(f"指定的路径无效:路径为空")
            return

    @staticmethod
    def is_non_str(string: str) -> bool:
        for i in string:
            if i != " " and i != " " and i != "":
                return False
        return True

    @staticmethod
    def addlist(list0: list[str], connect: str) -> str:
        re0 = ""
        for i in list0:
            re0 += i
            re0 +=connect
        return re0

    @staticmethod
    def isPath(string: str) -> bool:
        if "\\" in string or "/" in string:
            return True
        return False

    def isImportable(self, dict: str, argv: str):
        for i in self.ImportLessFile:
            if self.getstdpath(argv).strip() == i or (self.getstdpath(argv).strip() in i and self.getstdpath(dict).strip() in i):
                return False
        return True
    def use(self, args: list[str]):
        o_path = path.abspath(".")
        if args[1].strip() != "in":
            if not self.isImportable(self.path(), args[0]):
                print("无效导入:无法自己导入自己。"
                      f"\n\tuse {self.addlist(args, connect=" ")}"
                      f"\n\t    {"^" * len(args[0])}")
                return
            try:
                print(args[0].strip()[len(args[0]) - 3:])
                if not self.isPath(args[0].strip()):
                    if args[0].strip()[len(args[0]) - 3:] != ".py":
                        print("无效导入:文件类型错误。"
                              f"\n\tuse {self.addlist(args, connect=" ")}"
                              f"\n\t    {"^"*len(args[0])}")
                    else:
                        try:
                            print(f"import {args[0][:len(args[0])-3].strip()}")
                            exec(f"import {args[0][:len(args[0])-3].strip()}")
                        except:
                            print("无效导入:指定的文件不存在。"
                                    f"\n\tuse {self.addlist(args, connect=" ")}"
                                    f"\n\t    {"^"*len(args[0])}")
                else:
                    try:
                        filename, filepath = self.getfilend(args[0].strip())
                        if filepath is not None:
                            chdir(filepath)
                            sys.path.append(filepath)
                        exec(f"import {filename[:len(filename) - 3].strip()}")
                    except:
                        print("无效导入:指定的文件不存在。"
                              f"\n\tuse {self.addlist(args, connect=" ")}"
                              f"\n\t    {"^" * len(args[0])}")
                        return
            except:
                print("无效导入:文件类型错误。"
                      f"\n\tuse {self.addlist(args, connect=" ")}"
                      f"\n\t    {len(args[0])}")
            finally:
                chdir(o_path)
                sys.path.clear()
                sys.path.append(o_path)
        else:
            if not self.isImportable(self.path(), args[2]):
                print("无效导入:无法自己导入自己。"
                      f"\n\tuse {self.addlist(args, connect=" ")}"
                      f"\n\t    {" "*len(args[0])}    {"^" * len(args[2])}")
                return
            try:
                if path.isdir(args[2].strip()):
                    chdir(args[2].strip())
                    if args[0].strip()[len(args[0]) - 3:] != ".py":
                        print("无效导入:文件类型错误。"
                              f"\n\tuse {self.addlist(args, connect=" ")}"
                              f"\n\t    {"^"*len(args[0])}")
                    else:
                        try:
                            print(f"import {args[0][:len(args[0]) - 3].strip()}")
                            exec(f"import {args[0][:len(args[0]) - 3].strip()}")
                        except:
                            print("无效导入:指定的文件不存在。"
                                      f"\n\tuse {self.addlist(args, connect=" ")}"
                                      f"\n\t    {"^"*len(args[0])}")
                elif path.isfile(args[2].strip()):
                    try:
                        filename, filepath = self.getfilend(args[2].strip())
                        if filepath is not None:
                            chdir(filepath)
                            sys.path.append(filepath)
                        try:
                            exec(f"from {filename[:len(filename) - 3].strip()} import {args[0].strip()}")
                        except Exception as Error:
                            print("无效导入:指定的文件或模块不存在。"
                                  f"\n\tuse {self.addlist(args, connect=" ")}"
                                  f"\n\t    {" "*len(args[0])}    {"^" * len(args[2])}"
                                  f"SystemMsg: {Error}")
                    except:
                        print("无效导入:指定的文件目录不存在。"
                              f"\n\tuse {self.addlist(args, connect=" ")}"
                              f"\n\t    {" "*len(args[0])}    {"^" * len(args[2])}")
                else:
                    print("无效导入:指定的文件目录不存在。"
                          f"\n\tuse {self.addlist(args, connect=" ")}"
                          f"\n\t    {" "*len(args[0])}    {"^" * len(args[2])}")

            except:
                print("无效导入:文件类型错误。"
                      f"\n\tuse {self.addlist(args, connect=" ")}"
                      f"\n\t    {" "*len(args[0])}    {"^" * len(args[2])}")
            finally:
                chdir(o_path)
                sys.path.clear()
                sys.path.append(o_path)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值