-2

だから私はPythonでシェルを書いています、そしてファイル名はjsh.pyです。コードを実行すると、何らかの理由で機能しません。ウィンドウがポップアップしますが、すぐに閉じます。私のコードで何が摩耗していますか?

import os
import random
import time
import path
import string
import sys

commandAvail = 'ls where chdir mk mkdir cp mv rm rmdir view ext shutdown edit unix dos man-all man-unix man-dos'
commandAvailUnix = 'exec permission group'
commandAvailDos = ' '
print('Welcome to jsh alpha 1!')
commandPlatform = input('System: (UNIX/DOS):')
commandLine()

def commandLine():
        while 1 == 1:
                command = input('$ ')
                if command in commandAvail:
                        if command.startswith('ls'):
                                commandKeyword = 'ls'
                                commandOptions = command - commandKeyword
                                ls(commandOptions)
                        elif command.startswith('where'):
                                commandKeyword = 'where'
                                commandOptions = command - commandKeyword
                                where()
                        elif command.startswith('chdir'):
                                commandKeyword = 'chdir'
                                commandOptions = command - commandKeyword
                                chdir()
                        elif command.startswith('mk'):
                                commandKeyword = 'mk'
                                commandOptions = command - commandKeyword
                                mk()
                        elif command.startswith('mkdir'):
                                commandKeyword = 'mkdir'
                                commandOptions = command - commandKeyword
                                mkdir()
                        elif command.startswith('cp'):
                                commandKeyword = 'cp'
                                commandOptions = command - commandKeyword
                                cp()
                        elif command.startswith('mv'):
                                commandKeyword = 'mv'
                                commandOptions = command - commandKeyword
                                mv()
                        elif command.startswith('rm'):
                                commandKeyword = 'rm'
                                commandOptions = command - commandKeyword
                                rm()
                        elif command.startswith('rmdir'):
                                commandKeyword = 'rmdir'
                                commandOptions = command - commandKeyword
                                rm()
                        elif command.startswith('view'):
                                commandKeyword = 'view'
                                commandOptions = command - commandKeyword
                                rm()
                        elif command.startswith('edit'):
                                commandKeyword = 'edit'
                                commandOptions = command - commandKeyword
                                edit()
                        elif command == 'man-all':
                                print('Commands that work for all underlying platforms:')
                                print(commandAvail)
                        elif command == 'man-unix':
                                print('Commands that only work on Unix systems:')
                                print(commandAvailUnix)
                        elif command == 'man-dos'
                                print('Commands that only work on DOS systems:')
                                print(commandAvailDos)
                        elif command.startswith('unix'):
                                commandType = 'unix'
                                unix()
                        elif command.startswith('dos'):
                                commandType = 'dos'
                                dos()
                        elif command.startswith('ext'):
                                commandKeyword = 'ext'
                                commandOptions = command - commandKeyword
                                ext()
                        elif command == 'shutdown':
                                sys.quit(0)
                        else:
                                print('jsh has experienced an internal error and has to shutdown.')
                                sys.quit(10)
                else:
                        print('Command \'' + command + '\' not recognized as internal or external.')

def ls(options):
        if commandPlatform == 'UNIX':
                os.system('ls' + options)
        else:
                os.system('dir' + options)
        commandLine()
4

2 に答える 2

1

elif command =='man-dos'の後に':'を付けるのを忘れました

デバッグのためにpython3yourscriptを実行するだけです。

于 2013-01-25T05:49:45.670 に答える
1

現在のコードにはいくつかのエラーがあります。

  1. まず、インデントに使用されるタブとスペースの組み合わせなど、インデントがめちゃくちゃになっています。間違ったインデントは構文エラーであるため、これはPythonでは非常に悪いことです。質問のコードが正しく表示されるように修正しました(タブごとに8つのスペースを使用)が、ファイルでも修正する必要があります。また、Pythonの規則では、ブロックごとに4つのスペースでインデントすることに注意してください。そのため、デフォルトでこれを行うようにエディターを設定することをお勧めします。

  2. 次に、トップレベルチェックのロジックが正しくありません。コマンド文字列全体が変数にあるコマンドの文字列に含まれているかどうかをテストしていcommandAvailます。コマンドにコマンド名に加えて引数がある場合、これは間違ったことをします。私が提案するのはsplit、コマンド文字列を使用して用語のリストを取得し、最初の用語のみを使用可能なコマンドに対してテストすることです。そして、部分文字列検索を行うのではなく、文字列commandAvailのセットに分割することをお勧めします。

    # make a set of commands that we recognize
    commandAvail = set('ls where chdir mk mkdir cp'.split()) # trimmed for space
    
    # then later, test against it
    command = input().split()
    if command[0] in commandAvail: # this is much more efficient!
        # do stuff
    
  3. 最後に、コマンド文字列からコマンド自体を削除しようとしている方法が間違っています。別の文字列から文字列を減算することはできません(TypeError試してみると、が得られます)。幸い、前号で提案した解決策がここで役立ちます。文字列操作を行う代わりに、split呼び出しのおかげで用語のリストが表示されます。ここで、最初の項目(コマンド)に対してテストし、残りを引数として渡します。

    実際、これは、現在持っているif/ブロックの大きなチェーンよりもはるかに単純な実装を示唆しています。elif辞書を使用して、コマンド文字列とそれらを実装する関数をマッピングします。

    # map command names to the functions that implement them
    command_dict = {"ls":ls, "where":where, "chdir":chdir} # snipped
    
    # the main loop
    while True:
        # command is first term, the rest go into args
        command, *args = input().split()
    
        try: # use "easier to ask forgiveness than permission" idiom
            command_dict[command](*args) # call function from command_dict
        except KeyError:
            print("Unknown command: {}".format(command))
    
于 2013-01-25T05:50:00.563 に答える