樹莓派4B踩坑指南 - (15)搭建在線python IDE

今天想在樹莓派上本身搭一個在線的python IDE,因而找到了一篇教程--Fred913大神的從頭開始製做OJ-在線IDE的搭建
本身嘗試動手作了一下, 仍是發現很多細節須要注意, 記錄在此
若是不知道怎麼用樹莓派搭建網站的能夠參考我以前的文章: 樹莓派4B踩坑指南 - (11)免費搭建網站(寶塔,花生殼)
demo地址: http://bowen.51mypc.cn/editor/javascript

主要環境

  • PHP
  • Nginx/Apache
  • Python3

主要步驟

1) /api/python.php

  1. 網站根目錄下新建文件夾api, 注意這裏須要sudo或者su權限(下同), 而後使用mkdir api來建立
  2. touch python.php # 在api中新建文件python.php,
  3. nano python.php # 在文件中粘貼如下內容
<?php
//Powered By ShengFAN
//使用世界上最好的語言PHP進行開發-_-
$randint = rand();//爲用戶的代碼取一個隨機數做爲惟一碼
$f = fopen("/tmp/usrcode".$randint.".py", "w");
fwrite($f,$_GET['code']);
fclose($f);
echo str_replace("\n","<br>",passthru("python3 /tmp/usrcode".$randint.".py 2>&1")); //把換行轉爲html格式
unlink("/tmp/usrcode".$randint.".py"); //刪除用戶代碼,以避免形成tmp目錄擁擠
  1. 保存退出

2) /editor/src

  1. 回到網站根目錄, mkdir editor
  2. 去這裏(https://github.com/ajaxorg/ace-builds)點download zip, 而後把ace-builds-master.zip隨便解壓到哪一個地方, 而後把ace-builds-master裏邊全部的東西複製到editor文件夾, 如cp -r /home/pi/Desktop/n/ace-builds-master/* /www/wwwroot/bowen.51mypc.cn/editor/, 命令中的 -r/* 不要漏了. 複製完確認一下應該有這樣的一個目錄:/editor/src
  3. 新建index.php, touch index.php(這裏跟原文有出入, 下載的包裏沒有index.html)
  4. index.php中放入以下代碼(這裏跟原文有出入, 原文寫的是做者本身的網址, 這裏刪掉了php和html的選項並將python.php的地址改爲了相對路徑):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>FredTools IDE</title>
    <link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
    <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script>
      function runcode(code,type)
      {
        if(type == "python")
        {
          console.log(code);
          var xmlhttp;
          if (window.XMLHttpRequest)
          {
            //  IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼
            xmlhttp=new XMLHttpRequest();
          }
          else
          {
            // IE6, IE5 瀏覽器執行代碼
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
          xmlhttp.open("GET","../api/python.php?code=" + escape(code),false);
          xmlhttp.send();
          var data = xmlhttp.responseText;
          $("#output").html("<pre class=\"fillall\">" + data.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br>") + "</pre>");
        }
      }
    </script>
    <style type="text/css" media="screen">
      #editor {
        margin: 0;
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
      }
      .container {
        margin: 0;
        //position: absolute;
        top: 0;
        bottom: 0;
      }
      #editordiv {
        margin: 0;
        position: absolute;
        top: 0;
        bottom: 0;
        left:0;
        right:58.33333333333334%;
      }
      #iframediv {
        margin: 0;
        position: absolute;
        top: 0;
        bottom: 50%;
        left: 41.66666666666667%;
        right:16.66666666666667%;
      }
      #stepdiv {
        margin: 0;
        position: absolute;
        top: 50%;
        bottom: 0;
        left: 41.66666666666667%;
        right:16.66666666666667%;
      }
      .col-md-2 {
        margin: 0;
        position: absolute;
        top: 0;
        bottom: 0;
        left: 83.33333333333334%;
        right:0;
      }
    </style>
  </head>
  <body>

    <div class="container">
      <div class="col-md-5 column" id="editordiv">
        <pre id="editor"></pre>
      </div>
      <div class="col-md-5 column" id="iframediv">
        <h3>運行結果:</h3>
        <div id="output"></div>
      </div>
      <div class="col-md-5 column" id="stepdiv">
        <h3 id="stepcount">自由模式</h3>
        <p id="steptext">在此模式下,你能夠自由的使用FredTools IDE。</p>
        <p id="task">任務:無</p>
      </div>
      <div class="col-md-2 column">
        <!-- 更改語言-start -->
        <div class="form-group">
          <select name="language" id="language" class="form-control">
            <option value="python" selected>Python(.py)</option>
          </select>

          <button id="changelang" class="btn btn-default">
            更改語言
          </button>
        </div>
        <!-- 更改語言-end -->
        <br>
        <!-- 更改皮膚-end -->
        <div class="form-group">
          <select name="skin" id="skin" class="form-control">
            <?php require "../skin.html"; ?>
          </select>
          <button id="changeskin" class="btn btn-default">
            更改皮膚
          </button>
        </div>
        <!-- 更改語言-end -->
        <button class="btn btn-default" id="cheak">
          <span class="glyphicon glyphicon-play-circle"></span>運行代碼
        </button>
        <br><br>
        <div class="form-group">
          <input type="text" id="filename" placeholder="請輸入此文件文件名......" class="form-control">
          <button class="btn btn-default" id="savecode">
            <span class="glyphicon glyphicon-save"></span>保存代碼(經過Cookie)
          </button>
          <button class="btn btn-default" id="readcode">
            <span class="glyphicon glyphicon-open"></span>讀入代碼(經過Cookie)
          </button>
        </div>
      </div>
    </div>
    <script src="src-noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
    <script>
      var editor = ace.edit("editor");
      editor.setOptions({enableLiveAutocompletion: true});
      editor.setTheme("ace/theme/Chrome");
      editor.session.setMode("ace/mode/python");
      $("#changelang").click(function(){
        editor.session.setMode("ace/mode/" + $("#language").val());
      });
      $("#changeskin").click(function(){
        editor.setTheme("ace/theme/" + $("#skin").val());
      });
      $("#cheak").click(function(){
        var result = runcode(editor.getValue(), $("#language").val());
      });
      $("#savecode").click(function(){
        $.cookie("File-" + $("#filename").val(), editor.getValue());
      });
      $("#readcode").click(function(){
        editor.setValue($.cookie("File-" + $("#filename").val()));
      });
    </script>
  </body>
</html>

3) 調試運行

  1. 滿心歡喜的打開bowen.51mypc.cn/editor, 而後就悲劇了:沒法使用
  2. 仔細讀代碼發現裏邊有一行<?php require "../skin.html"; ?> 哦, 原來沒有這個文件因此卡這了, 那就回去新建一個吧
  3. 回到網站根目錄, nano skin.html, 寫入一行<option value='chrome'>Chrome</option>, 保存退出. (這裏跟原文有出入, 由於實際上並無皮膚能夠換, 就把其餘的刪掉了...)
  4. 刷新頁面, 誒, 果真能夠了...嗎?
  5. 百度了一下, 這個問題應該是php.ini中的passthru函數被禁用了, 本想去找這個ini文件, 後來想一想這種東西估計寶塔面板裏就有,就去找了一下, 還真找到了:
  6. 大功告成! print("hello world")

待解決問題

  1. 試了下, 這裏用不了input()函數(EOFError: EOF when reading a line), 估計是交互性無法知足, 但願後續能補上這個不足吧!
  2. 不知道性能佔用怎麼樣, 若是多人同時調用的話, 有可能會有新問題, 之後再測試.
相關文章
相關標籤/搜索