ロボットシステム学

第2回: Linux環境での
PythonプログラミングI

千葉工業大学 上田 隆一


This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. Creative Commons License

ロボットシステム学第2回

今日やること

  • 前半: Pythonの入門
    • C言語をちょっとやったくらいの人を想定
    • 変数、関数、リスト、for文
      • とりあえずこれくらい覚えておけば、できることは結構多い
  • 後半: LinuxでPython等のコードを使うときの方法
    • こっちの方が大変
    • 「ロボットシステム学」なので
ロボットシステム学第2回

前半: Python入門

ロボットシステム学第2回

最初のコード

  • Vimで(emacsに慣れている人はemacsで)書きましょう
    • ファイル名はhello.py
      $ vi hello.py
      
    • hello.pyの中身
      print("hello")              #文字列を出力
      print(3.14)                 #数字を出力
      
      • #」より後ろはコメント
  • 実行(python3コマンドに読み込ませる)
    $ python3 hello.py
    hello
    3.14
    
ロボットシステム学第2回

Pythonの文字列、数字と関数

  • 文字列、数字(リテラル
    • 文字列は""''で囲む
      "hello", 'hello', "That's a pen."                                                
      
    • 数字はそのまま記述
      3.14, -1, 5
      1.23e+100 #1.23かける10の100乗                                             
      
  • 関数の使用: 「名前(引数, 引数, ...)」と記述
    • 例: 前ページに出てきた関数: print関数
      • 字を端末に出力する
      • C言語のputsprintfなどに相当
      • 文字列も数字も(他のいくつかの型のものも)受け付け
ロボットシステム学第2回

Pythonの変数

  • 要点
    • 値(数字や文字列、その他のもの)に名前を付与できる
      • 「値を変数に代入」というより「値を名前で参照」
    • 型は書かなくてよい
    ### コードの例 ###
    name = "上田"   #「上田」という文字列にnameという名前を付ける
    money = 5       #5という数字にmoneyという名前をつける
    print("{}の所持金: {}円".format(name, money) ) #文字列に対してformatメソッドを呼び出し                          
    
    • 「メソッド」: いまのところ値や変数に対してなにか操作するための関数のようなものと理解しておく
    • 実行(var.pyというファイル名で)
      $ python3 var.py
      上田の所持金: 5円                                                          
      
ロボットシステム学第2回

Pythonのリストとfor文

  • 要点
    • リスト: 複数の値を並べて記録できるもの
    • for文: リストの要素をひとつずつ処理するもの
      • for文の中身は右側に余白(インデント
      ### コードの例 ###
      fruits = ["apple", "banana", "cherry" ]  #文字列3つのリストをfruitsと命名                   
      
      for f in fruits:
          print(f + "はおいしい")             # + で文字列を連結できる
      #↑インデントは半角空白4文字が標準(講義では厳密に守ること)
      
    • 実行(fruits.pyというファイル名でコードを保存)
      $ python3 fruits.py
      appleはおいしい
      bananaはおいしい
      cherryはおいしい
      
ロボットシステム学第2回

リスト要素の取得

  • 要点
    • 基本はC言語と同じ
    • 負の値を指定すると後ろから要素を指定可能
    ### コードの例(list.py) ###
    fruits = ["apple", "banana", "cherry" ]
    print("最初の要素: " + fruits[0])      #先頭は0番目
    print("次の要素: " + fruits[1])        #次の要素は1番目
    print("最後の要素: " + fruits[-1])     #最後の要素
    
  • 実行結果
    $ python3 list.py
    最初の要素: apple
    次の要素: banana
    最後の要素: cherry
    
ロボットシステム学第2回

リスト要素の範囲指定(スライス)

  • リストを部分的に取り出して新たにリストを作成できる
    ### コードの例(list2.py) ###
    fruits = ["a", "b", "c", "d", "e" ]
    print("0番目から2番目の要素: ", fruits[0:3])
    print("2番目以降の要素: ", fruits[2:])
    print("ひとつ飛ばしでリストを作成: ", fruits[0::2])
    
    • 注意: 上のprintでは出力したい文字列をふたつの引数に分けている
  • 実行結果
    $ python3 list2.py 
    0番目から2番目の要素:  ['a', 'b', 'c']
    2番目以降の要素:  ['c', 'd', 'e']
    ひとつ飛ばしでリストを作成:  ['a', 'c', 'e']
    
ロボットシステム学第2回

練習

  • 次のようなPythonのスクリプトを作ってみましょう
    • なにかリストを作成して、作ったリストについて、奇数の要素だけ出力
    • さらに余裕があれば、出力する際になにか文字を付加
      • 例: 6ページ or 7ページ
ロボットシステム学第2回

後半: Linuxとスクリプト

ロボットシステム学第2回

hello.pyの実行方法の観察

  • コマンド「python3」がファイル「hello.py」の中身を見て実行
    $ python3 hello.py
    
    • テキストファイルを読み込んで直接実行: インタプリタ
      • 厳密には少し違うけど、とりあえずこの理解で
    • C言語と異なる
    $ gcc hoge.c    #gccでhoge.cをコンパイル
    $ ./a.out       #できたa.outを実行
    
ロボットシステム学第2回

問題: 次のような需要が存在

  • ./a.outみたいに、次のように実行したい
    $ ./hello.py
    
    • 理由
      • プログラムを使う側は、インタプリタが何かを意識したくない
        • 適切なインタプリタを勝手に選んでほしい
        • lsls.pyという名前だとおかしい
  • 可能とするには2つ作業が必要
    • シバンによるインタプリタの指定
    • 実行権限の付与
ロボットシステム学第2回

作業1: インタプリタの指定

  • shebang(「シバン」と呼ぶ)を使用
    • 次のようにhello.pyを変更(1行目がシバン)
      #!/usr/bin/python3
                        #この空行はいらないが、読みやすさのためにあける
      print("hello")
      print(3.14)
      
    • シバンの書き方
      • 1行目に「#!<インタプリタ名>」と記述
        <>は「必ず書く」という意味を表すカッコで実際は書かない)
        • インタプリタはパスで指定(which python3で調査可能)
      • #!の前に空白を入れない
    • Linuxがシバンを読んでインタプリタを起動
ロボットシステム学第2回

作業2: 実行権限の付与

  • ls -lで出る表示の1列目に「x」がないと実行できない
    • パーミッション(次ページ)
    • 事故防止のため
      $ ./hello.py                            #実行してみる
      bash: ./hello.py: 許可がありません      #できない
      $ ls -l hello.py                        #ls -lで確認
      -rw-r--r-- 1 ueda ueda 47 11月 30 06:50 hello.py
      $ ls -l a.out                           #gccで作ったa.outには最初から存在                  
      -rwxr-xr-x 1 ueda ueda 16464 11月 30 07:16 a.out
      
  • 付与の方法: chmodを使用
    $ chmod +x hello.py
    $ ./hello.py                            #実行できる
    hello
    3.14
    $ ls -l hello.py
    -rwxrwxr-x 1 ueda ueda 144 11月 30 18:31 hello.py                             
    
ロボットシステム学第2回

パーミッション

  • ls -lで1列目に出てくるファイルの利用条件
    • そのファイルの「読む権利」「書く権利」「実行する権利」
      $ ls -l hello.py
      -rwxr-xr-x 1 ueda ueda 47 11月 30 06:50 hello.py
      
  • 当面は最初のrwxを気にするとよい
    • rが存在: 読める
    • wが存在: 書ける
    • xが存在: 実行できる
ロボットシステム学第2回

hello(.py)の実行

  • こうなればOK
    $ ./hello.py
    hello
    3.14
    ### 拡張子を除去してもよい(拡張子をつけるかどうかは場合による) ###               
    $ mv hello.py hello
    $ ./hello
    (略)
    
    • mv: 移動、名前の変更
  • PATHを使ってみる(前回参照)
    • 「パスの通った」コマンドとして呼び出せる
      $ PATH=$PATH:/home/ueda  #PATHの値に「:今いるディレクトリ」と文字列を追加
      $ hello
      (略)
      $ exit                   #シェルを終了すると追加した文字列は消える               
      
ロボットシステム学第2回

練習

  • なにかプログラムを作り、シバン、パスを駆使して、
    パスの通ったコマンドとして実行
ロボットシステム学第2回

まとめ

  • Pythonのプログラムを書いて動かした
  • Pythonのプログラムの裏でのLinuxやシェルの挙動を確認
    • シバン
    • パーミッション
  • 重要語句: インタプリタ、シバン、パーミッション、
    「パスが通った」
  • コマンド: python3whichchmodmv
ロボットシステム学第2回