有關構建腳本
『壹』 1.構建JS登錄腳本
在編寫xshell腳本的過程中用到最多的就是自動輸入,自動捕獲,延時等語句
自動輸入
以自動輸入xyz為例
自動輸入的語句:xsh.Screen.Send("xyz");
當然,如果你輸入的是一條命令,還需要下面這一行輸入回車
輸入回車的語句:xsh.Screen.Send(String.fromCharCode(13));
自動捕獲
以linux系統為例,一般程序執行的列印數據位於倒數第二行,如下圖所示
/* 字元串處理 */
var ScreenRow, ReadLine, Items;
/* 讀取倒數第二行,長度為40個字元 */
ScreenRow = xsh.Screen.CurrentRow - 1;
ReadLine = xsh.Screen.Get(ScreenRow, 1, ScreenRow, 40);
延時
以等待1s為例
延時語句:xsh.Session.Sleep(1000);
其他
打開新會話:xsh.Session.Open(string);
對話框提醒:xsh.Dialog.MsgBox(string);
設置日誌路徑:xsh.Session.LogFilePath = string;
開始記錄日誌:xsh.Session.StartLog();
清屏函數:xsh.Screen.Clear();
等待輸入:xsh.Screen.WaitForString(string);
示例
本文以一個自動測試腳本為例,定時向/tmp/test文件寫入數據,然後回讀列印,截獲回讀列印的值進行分析
/* 測試函數 /
function test()
{
/ 發送echo 112233 > /tmp/testfile */
xsh.Screen.Send("echo 112233 > /tmp/testfile");
xsh.Screen.Send(String.fromCharCode(13));
}
/* 主函數 /
function Main()
{
/ 打開會話,根據實際的會話路徑修改 */
xsh.Session.Open("C: Computer6XshellSessionsubuntu.xsh");
xsh.Screen.Synchronous = true;
// xsh.Screen.WaitForString("start");
// xsh.Screen.Clear();
}
運行腳本的操作:
在編寫xshell腳本的過程中用到最多的就是自動輸入,自動捕獲,延時等語句
自動輸入
以自動輸入xyz為例
自動輸入的語句:xsh.Screen.Send("xyz");
當然,如果你輸入的是一條命令,還需要下面這一行輸入回車
輸入回車的語句:xsh.Screen.Send(String.fromCharCode(13));
自動捕獲
以linux系統為例,一般程序執行的列印數據位於倒數第二行,如下圖所示
/* 字元串處理 */
var ScreenRow, ReadLine, Items;
/* 讀取倒數第二行,長度為40個字元 */
ScreenRow = xsh.Screen.CurrentRow - 1;
ReadLine = xsh.Screen.Get(ScreenRow, 1, ScreenRow, 40);
延時
以等待1s為例
延時語句:xsh.Session.Sleep(1000);
其他
打開新會話:xsh.Session.Open(string);
對話框提醒:xsh.Dialog.MsgBox(string);
設置日誌路徑:xsh.Session.LogFilePath = string;
開始記錄日誌:xsh.Session.StartLog();
清屏函數:xsh.Screen.Clear();
等待輸入:xsh.Screen.WaitForString(string);
示例
本文以一個自動測試腳本為例,定時向/tmp/test文件寫入數據,然後回讀列印,截獲回讀列印的值進行分析
/* 測試函數 /
function test()
{
/ 發送echo 112233 > /tmp/testfile */
xsh.Screen.Send("echo 112233 > /tmp/testfile");
xsh.Screen.Send(String.fromCharCode(13));
}
/* 主函數 /
function Main()
{
/ 打開會話,根據實際的會話路徑修改 */
xsh.Session.Open("C: Computer6XshellSessionsubuntu.xsh");
xsh.Screen.Synchronous = true;
// xsh.Screen.WaitForString("start");
// xsh.Screen.Clear();
}
運行腳本的操作:
實際執行結果如下:
『貳』 如何使用Docker構建運行時間較長的腳本
問題
讓我們從這個我試圖解決的問題開始。我開發了一個會運行很長時間的構建腳本,這個腳本中包含了很多的步驟。
這個腳本會運行1-2個小時。
它會從網路下載比較大的文件(超過300M)。
後面的構建步驟依賴前期構建的庫。
但最最煩人的是,運行這個腳本真的需要花很長的時間。
文件系統是固有狀態
我們一般是通過一種有狀態的方式與文件系統進行交互的。我們可以添加、刪除或移動文件。我們可以修改文件的 許可權或者它的訪問時間。大部分獨立的操作都可以撤銷,例如將文件移動到其它地方後,你可以將文件恢復到原來的位置。但我們不會通過快照的方式來將它恢復到 原始狀態。這篇文章我將會介紹如何在耗時較長的腳本中充分利用快照這一特性。
使用聯合文件系統的快照
Docker使用的是聯合文件系統叫做AUFS(譯者註:簡單來說就是支持將不同目錄掛載到同一個虛擬文件系統下的文件系統)。聯合文件系統實現了Union mount。顧名思義,也就是說不同的文件系統的文件和目錄可以分層疊加在單個連貫文件系統之上。這是通過分層的方式完成的。如果一個文件出現在兩個文件系統,那最高層級的文件才會顯示(該文件其它版本也是存在於層級中的,不會改變,只是看不到的)。
在Docker中,每一個在Union mount轉哦給你的文件系統都被稱為layers(層)。使用這種技術可以輕松實現快照,每個快照都是所有層的一個Union mount。
生成腳本的快照
使用快照可以幫助構建一個長時運行的腳本。總的想法是,將一個大的腳本分解為許多小的腳本(我喜歡稱之為 scriptlets),並單獨運行這些小的腳本,腳本運行後為其文件系統打一個快照 (Docker會自動執行此操作)。如果你發現一個scriptlet運行失敗,你可以快速回退到上次的快照,然後再試一次。一旦你完成腳本的構建,並且 可以保證腳本能正常工作,那你就可以將它分配給其它主機。
回過頭來再對比下,如果你沒有使用快照功能了?當你辛辛苦苦等待了一個半小時後,腳本卻構建失敗了,我想除了少部分有耐心的人外,很多人是不想再來一次了,當然,你也會盡最大努力把系統恢復到失敗前的狀態,比如可以刪除一個目錄或運行make clean。
但是,我們可能沒有真正地理解我們正在構建的組件。它可能有復雜的Makefile,它會把把文件放到文件系統中我們不知道的地方,唯一真正確定的途徑是恢復到快照。
使用快照構建腳本的Docker
在本節中,我將介紹我是如何使用Docker實現GHC7.8.3 ARM交叉編譯器的構建腳本。Docker非常適合做這件事,但並非完美。我做了很多看起來沒用的或者不雅的事情,但都是必要的,這都是為了保證將開發腳本的總時間降到最低限度。構建腳本可以在這里找到。
用Dockerfile構建
Docker通過讀取Dockerfile來構建鏡像。Dockerfile會通過一些命令來具體指定應該執行哪些動作。具體使用說明可以參考這篇文章。在我的腳本中主要用到WORKDIR、ADD和RUN。ADD命令非常有用因為它可以讓你在運行之前將外部文件添加到當前Docker鏡像中然後轉換成鏡像的文件系統。你可以在這里看到很多scriptlets構成的構建腳本。
設計
1. 在RUN之前ADD scriptlets
如果你很早就將所有的scriptletsADD在Dockerfile,您可能會遇到以下問題:如果你的腳本構建失敗,你回去修改scriptlet並再次運行docker build。但是你發現,Docker開始在首次加入scriptlets的地方構建!這樣做會浪費了大量的時間並且違背了使用快照的目的。
出現這種情況的原因是由於Docker處理它的中間鏡像(快照)的方式。當Docker通過Dockerfile構建鏡像時,它會與中間鏡像比較當前命令是否一致。然而,在ADD命令的情況下被裝進鏡像的文件里的內容也會被檢查。如果相對於現有的中間鏡像,文件已經改變,那麼Docker也別無選擇,只能從這點開始建立一個新的鏡像。因為Docker不知道這些變化會不會影響到構建。
此外,使用RUN命令要注意,每次運行時它都會導致文件系統有不同的更改。在這種情況下,Docker會發現中間鏡像並使用它,但是這將是錯誤的。RUN命令每次運行時會造成文件系統相同的改變。舉個例子,我確保在我的scriptlets我總是下載了一個已知版本的文件與一個特定MD5校驗。
對Docker 構建緩存更詳細的解釋可以在這里找到。
2.不要使用ENV命令來設置環境變數,請使用scriptlet。
它似乎看起來很有誘惑力:使用ENV命令來設置所有構建腳本需要的環境變數。但是,它不支持變數替換的方式,例如 ENV BASE=$HOME/base 將設置BASE的值為$HOME/base著很可能不是你想要的。
相反,我用ADD命令添加一個名為set-env.sh文件。此文件會包含在後續的scriptlet中:
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $THIS_DIR/set-env-1.sh
如果你沒有在第一時間獲取set-env.sh會怎麼樣呢?它很早就被加入Dockerfile並不意味著修改它將會使隨後的快照無效?
是的,這會有問題。在開發腳本時,我發現,我已經錯過了在set-env.sh添加一個有用的環境變數。解決方案是創建一個新的文件set-env-1.sh包含:
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $THIS_DIR/set-env.sh
if ! [ -e "$CONFIG_SUB_SRC/config.sub" ] ; then
CONFIG_SUB_SRC=${CONFIG_SUB_SRC:-$NCURSES_SRC}
fi
然後,在所有後續的scriptlets文件中包含了此文件。現在,我已經完成了構建腳本,我可以回去解決這個問題了,但是,在某種意義上,它會破壞最初的目標。我將不得不從頭開始運行構建腳本看看這種變化是否能成功。
缺點
一個主要缺點是這種方法是,所構建的鏡像尺寸是大於它實際需求的尺寸。在我的情況下尤其如此,因為我在最後刪除了大量文件的。然而,這些文件都仍然存在於聯合掛載文件系統的底層文件系統內,所以整個鏡像是大於它實際需要的大小至少多餘的是刪除文件的大小。
然而,有一個變通。我沒有公布此鏡像到Docker Hub Registry。相反,我:
使用docker export導出內容為tar文件。
創建一個新的Dockerfile簡單地添加了這個tar文件的內容。
產生尺寸盡可能小的鏡像。
結論
這種方法的優點是雙重的:
它使開發時間降至最低,不再做那些已經構建成功的子組件。你可以專注於那些失敗的組件。
這非常便於維護構建腳本。構建可能會失敗,但只要你搞定Dockerfiel,至少你不必再從頭開始。
此外,正如我前面提到的Docker不僅使寫這些構建腳本更加容易,有了合適的工具同樣可以在任何提供快照的文件系統實現。
『叄』 如何創建一個腳本文件
創建腳本文件的方法:
1、在工具欄上單擊「新建」,或者在「文件」菜單上單擊「新建」。
2、在一個新選項卡中顯示創建的文件。默認情況下,所創建文件的類型為腳本(.ps1),但可使用新的名稱和擴展名對其進行保存。
3、可在同一PowerShell選項卡中創建多個腳本文件。
腳本文件英文為Script。實際上腳本就是程序,一般都是由應用程序提供的編程語言。應用程序包括瀏覽器(javaScript、VBScript)、多媒體創作工具,應用程序的宏和操作系統的批處理語言也可以歸入腳本之類。腳本文件類似於DOS操作系統中的批處理文件,它可以將不同的命令組合起來,並按確定的順序自動連續地執行。腳本文件是文本文件,用戶可使用任一文本編輯器來創建腳本文件。
『肆』 maven2 的項目構建腳本是什麼 給個例子 謝謝
大多數組織將會創建自己的內部開發庫,用於配置,而中心開發庫用於連接maven
設置內部開發庫是簡單的,使用http協議,可以使用存在的http 伺服器。或者創建新的服務,使用apache,或者jetty
假設伺服器地址192.168.0.2 ,埠8080
http://192.168.0.2:8080/repo-local
設置另外一個開發庫,用於設置項目的snapshot庫http://192.168.0.2:8080/repo-snapshot
中心鏡像庫,使用maven-proxy創建,當然也可以創建自己的鏡像。用於下載本地庫中沒有的artifact
maven-proxy 設置
從網上直接下載maven-proxy-standalone-0.2-app.jar和 proxy.properties
在命令行中,直接運行java -jar maven-proxy-standalone-0.2-app.jar proxy.properties
主要的配置:
設置repo.list 中增加相應的庫就可以,如下定義:
repo.list=repo1.maven.org,...
#maven 的中心庫
repo.repo1.maven.org.url=http://repo1.maven.org/maven2
repo.repo1.maven.org.description=maven.org
repo.repo1.maven.org.proxy=one
repo.repo1.maven.org.hardfail=false
repo.repo1.maven.org.cache.period=360000
repo.repo1.maven.org.cache.failures=true
以後所有的遠程庫,都通過此方式增加。順便說一下,不要忘了注釋原來的example,那是沒有辦法訪問的。
其他配置如
埠號 port=9999
保存的位置 repo.local.store=target/repo
serverName=http://localhost:9999
創建標準的組織pom
定義共同的內容,包括公司的結構,如組織,部門以及團隊。
察看一下maven 的自身,可以作為很好的參考。
如scm
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>1</version>
</parent>
<groupId>org.apache.maven.scm</groupId>
<artifactId>maven-scm</artifactId>
<url>http://maven.apache.org/maven-scm/</url>
...
<moles>
<mole>maven-scm-api</mole>
<mole>maven-scm-providers</mole>
...
</moles>
</project>
在maven父項目中可以看到如下定義:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>1</version>
</parent>
<groupId>org.apache.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>5</version>
<url>http://maven.apache.org/</url>
...
<mailingLists>
<mailingList>
<name>Maven Announcements List</name>
<post>[email protected]</post>
...
</mailingList>
</mailingLists>
<developers>
<developer>
...
</developer>
</developers>
</project> maven 父pom包括了共享的元素,如聲明郵件列表,開發者。並且大多數項目繼承apache組織:<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>1</version>
<organization>
<name>Apache Software Foundation</name>
<url>http://www.apache.org/</url>
</organization>
<url>http://www.apache.org/</url>
...
<repositories>
<repository>
<id>apache.snapshots</id>
<name>Apache Snapshot Repository</name>
<url>http://svn.apache.org/maven-snapshot-repository</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
...
<distributionManagement>
<repository>
...
</repository>
<snapshotRepository>
...
</snapshotRepository>
</distributionManagement>
</project>
對於項目自身來說,父pom很少更新。所以,最後的方式保存父pom文件在單獨的版本控制區域,它們能夠check out,更改和配置.
使用Continuum持久整合
持續整合自動build你的項目,通過一定的時間,包括所有的沖突在早期察覺,而不是發布的時候。另外持續整合也是一種很好的開發方式,使團隊成員能產生細微的,交互的變動,能更有效的支持平行開發進程。
可以使用maven的continuum作為持久整合的服務。
安裝continuum,比較簡,使用以下的命令:
C:\mvnbook\continuum-1.0.3> bin\win32\run
可以通過http://localhost:8082/continuum來驗證
為了支持continuum 發送e-mail提醒,你需要相應的smtp服務用於發送信息。默認使用localhost:25,如果你沒有設置,編輯上面的文件改變smtp-host設置。
下一步,設置svn目錄:
svn co file://localhost/C:/mvnbook/svn/proficio/trunk proficio
編輯pom.xml用於正確相應得e-mail地址。
...
<ciManagement>
<system>continuum</system>
<url>http://localhost:8080/continuum
<notifiers>
<notifier>
<type>mail</type>
<configuration>
<address>[email protected]</address>
</configuration>
</notifier>
</notifiers>
</ciManagement>
...
<scm>
<connection>
scm:svn:file://localhost/c:/mvnbook/svn/proficio/trunk
</connection>
<developerConnection>
scm:svn:file://localhost/c:/mvnbook/svn/proficio/trunk
</developerConnection>
</scm>
...
<distributionManagement>
<site>
<id>website</id>
<url>
file://localhost/c:/mvnbook/repository/sites/proficio
/reference/${project.version}
</url>
</site>
</distributionManagement>
提交相應的pom,然後執行mvn install
如果你返回http://localhost:8082/continuum,你會看到相應的項目列表。
一旦你登錄後,你可以選擇mavan 2.0項目用於增加相應的項目。你可以增加你的url或者提交你的本地內容。
你可以使用本地pom url,如下file://localhost/c:mvnbook/proficio/pom.xml
在提交了此url後,continuum將會返回相應的成功信息。
以下的原則用於更好的幫助持續整合:
早提交,經常提交:當用戶經常提交時,持續整合是最有效的。這並不意味著,提交不正確的代碼。
經常運行build:用於最快檢測失敗
盡快修正失敗:當失敗發生時,應該馬上修正失敗
建議一個有效的版本
運行clean build
運行復雜的綜合測試
build所有的項目結構分支
持續運行項目的拷貝
『伍』 如何在unix中創建任意腳本
你可以使用nohup和&運算符守護Unix中的任何可執行文件:
復制代碼
nohup yourScript.sh script args&
nohup命令允許你關閉shell會話而不殺死腳本,而&將腳本放在後台,這樣你就可以得到shell提示來繼續你的會話。 它的輸出將在這個庄園intertwined,這樣帶來唯一的小問題是標准輸出和標准錯誤都被送到了把/nohup 。出來所以如果你啟動幾個 scripts. 更好的命令是:
復制代碼
nohup yourScript.sh script args> script.out 2>script.error&
這將把標准輸出到你選擇的文件,並將標准錯誤發送給你選擇的其他文件。 如果你想只使用一個文件為標准輸出和標准錯誤,你可以:
復制代碼
nohup yourScript.sh script args> script.out 2>&1 &
2> & 1 通知shell將標准錯誤( 文件描述符 2 ) 重定向到與標准輸出( 文件描述符 1 ) 相同的文件。
要只運行一次命令並重新啟動它,可以使用這里腳本:
復制代碼
#!/bin/bashif [[ $# <1 ]]; then
echo"Name of pid file not given."
exitfi# Get the pid file's name.PIDFILE=$1
shiftif [[ $# <1 ]]; then
echo"No command given."
exitfiecho"Checking pid in file $PIDFILE."#Check to see if process running.PID=$(cat $PIDFILE 2>/dev/null)if [[ $? = 0 ]]; then
ps -p $PID>/dev/null 2>&1
if [[ $? = 0 ]]; then
echo"Command $1 already running."
exit
fifi# Write our pid to file.echo $$> $PIDFILE# Get command.COMMAND=$1
shift# Run command until we're killed.while true; do
$COMMAND"$@"
sleep 10 # if command dies immediately, don't go into un-ctrl-c-able loopdone
第一個參數是要使用的pid文件的名稱。 第二個參數是命令。 所有其他參數都是命令的參數。
如果你將這里腳本命名為 restart.sh,這就是你將如何調用它:
復制代碼
nohup restart.sh pidFileName yourScript.sh script args> script.out 2>&1 &
『陸』 Gradle 構建腳本基礎:Settings 文件
----《Android Gradle 權威指南》學習筆記
總目錄: Gradle 學習系列 -- 目錄
上一篇: Gradle 入門:命令行
下一篇: Gradle 構建腳本基礎:Build 文件
『柒』 如何生成腳本
這在將資料庫對象重置為其原始條件時很有用。例如,在進行大量測試修改了某個表後,可以使用創建腳本還原該表。只能在使用
sql
託管提供程序與
sql
server
建立的連接中生成創建腳本。注意創建腳本可以重新創建資料庫對象的結構但不能重新創建數據。注意顯示的對話框和菜單命令可能會與「幫助」中的描述不同,具體取決於您的當前設置或版本。若要更改設置,請在「工具」菜單上選擇「導入和導出設置」。有關更多信息,請參見
visual
studio
設置。生成創建腳本將腳本從伺服器資源管理器拖動到解決方案資源管理器的「創建腳本」文件夾中。-或
-打開要在其中保存創建腳本的資料庫項目。
注意若要生成創建腳本,必須在解決方案中創建資料庫項目。若要創建新的資料庫項目,請在「文件」菜單中單擊「新建項目」,然後在「新建項目」對話框的「項目類型」下打開「其他項目類型」節點。單擊「資料庫」,然後在「模板」窗口中單擊「資料庫」模板圖標。給解決方案命名,然後單擊「確定」。在伺服器資源管理器中,右擊要為其生成創建腳本的資料庫對象。從快捷菜單中選擇「為項目生成創建腳本」。請參見其他資源使用腳本
『捌』 Gradle 構建腳本基礎:任務依賴
----《Android Gradle 權威指南》學習筆記
總目錄: Gradle 學習系列 -- 目錄
上一篇: Gradle 構建腳本基礎:Projects 和 tasks
下一篇: Gradle 構建腳本基礎:任務間交互
在命令行中執行命令: gradle -q taskMain
列印結果:
在命令行中執行命令: gradle -q taskMultiMain
列印結果:
『玖』 如何創建和使用python CGI腳本
你是否想使用Python語言創建一個網頁,或者處理用戶從web表單輸入的數據?這些任務可以通過Python CGI(公用網關介面)腳本以及一個Apache web伺服器實現。當用戶請求一個指定URL或者和網頁交互(比如點擊」」提交」按鈕)的時候,CGI腳本就會被web伺服器啟用。CGI腳本調用執行完畢後,它的輸出結果就會被web伺服器用來創建顯示給用戶的網頁。配置Apache web伺服器,讓其能運行CGI腳本在這個教程里,我們假設Apache web伺服器已經安裝好,並已運行。這篇教程使用的Apache web伺服器(版本2.2.15,用於CentOS發行版6.5)運行在本地主機(127.0.0.1),並且監聽80埠,如下面的Apache指令指定一樣:12ServerName 127.0.0.1:80Listen 80下面舉例中的HTML文件存放在web伺服器上的/var/www/html目錄下,並通過DocumentRoot指令指定(指定網頁文件所在目錄):1DocumentRoot "/var/www/html"現在嘗試請求URL:這將返回web伺服器中下面文件的內容:1/var/www/html/page1.html為了啟用CGI腳本,我們必須指定CGI腳本在web伺服器上的位置,需要用到ScriptAlias指令:1ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"以上指令表明CGI腳本保存在web伺服器的/var/www/cgi-bin目錄,請求URL里包含/cgi-bin/的將會搜索這個目錄下的CGI腳本。我們必須還要明確CGI腳本在/var/www/cgi-bin目錄下有執行許可權,還要指定CGI腳本的文件擴展名。使用下面的指令:12Options +ExecCGIAddHandler cgi-script .py下面訪問URL:這將會調用web伺服器中下面所示腳本:1/var/www/cgi-bin/myscript-1.py創建一個CGI腳本在創建一個Python CGI腳本之前,你需要確認你已經安裝了Python(這通常是默認安裝的,但是安裝版本可能會有所不同)。本篇教程使用的腳本是使用Python版本2.6.6編寫的。你可以通過下面任意一命令(-V和–version參數將顯示所安裝Python的版本號)檢查Python的版本。Shell12$ python -V$ python --version如果你的Python CGI腳本要用來處理用戶輸入的數據(從一個web輸入表單),那麼你將需要導入Python cgi模塊。這個模塊可以處理用戶通過web輸入表單輸入的數據。你可以在你的腳本中通過下面的語句導入該腳本:Shell1import cgi你也必須修改Python CGI腳本的執行許可權,以防止web伺服器不能調用。可以通過下面的命令增加執行許可權:Shell1# chmod o+x myscript-1.pyPython CGI例子涉及到Python CGI腳本的兩個方案將會在下面講述:使用Python腳本創建一個網頁讀取並顯示用戶輸入的數據,並且在網頁上顯示結果注意:Python cgi模塊在方案2中是必需的,因為這涉及到用戶從web表單輸入數據。例子1 :使用Python腳本創建一個網頁對於這個方案,我們將通過創建包含一個單一提交按鈕的網頁/var/www/html/page1.html開始。XHTML123456Test Page 1當」提交」按鈕被點擊,/var/www/cgi-bin/myscript-1.py腳本將被調用(通過action參數指定)。通過設置方法參數為」get」來指定一個」GET」請求,伺服器將會返回指定的網頁。/var/www/html/page1.html在瀏覽器中的顯示情況如下:/var/www/cgi-bin/myscript-1.py的內容如下:1234567#!/usr/bin/pythonprint "Content-Type: text/html"print ""print ""print "CGI Script Output"print "This page was generated by a Python CGI script."print ""第一行聲明表示這是使用 /usr/bin/python命令運行的Python腳本。」Content-Type: text/html」列印語句是必需的,這是為了讓web伺服器知道接受自CGI腳本的輸出類型。其餘的語句用來輸出HTML格式的其餘網頁內容。當」Submit」按鈕點擊,下面的網頁將返回:這個例子的要點是你可以決定哪些信息可以被CGI腳本返回。這可能包括日誌文件的內容,當前登陸用戶的列表,或者今天的日期。在你處理時擁有所有python庫的可能性是無窮無盡的。例子2:讀取並顯示用戶輸入的數據,並將結果顯示在網頁上對於這個方案,我們將通過創建一個含有三個輸入域和一個提交按鈕的網頁/var/www/html/page2.html開始。XHTML123456789Test Page 2當」Submit」按鈕點擊,/var/www/cgi-bin/myscript-2.py腳本將被執行(通過action參數指定)。/var/www//html/page2.html顯示在web瀏覽器中的圖片如下所示(注意,三個輸入域已經被填寫好了):/var/www/cgi-bin/myscript-2.py的內容如下:Python1234567891011121314#!/usr/bin/pythonimport cgiform = cgi.FieldStorage()print "Content-Type: text/html"print ""print ""print "CGI Script Output"print ""print "The user entered data are:"print "First Name: " + form["firstName"].value + ""print "Last Name: " + form["lastName"].value + ""print "Position: " + form["position"].value + ""print ""print ""正如前面提到,import cgi語句用來確保能夠處理用戶通過web輸入表單輸入的數據。web輸入表單被封裝在一個表單對象中,叫做cgi.FieldStorage對象。一旦開始輸出,」Content-Type: text/html」是必需的,因為web伺服器需要知道接受自CGI腳本的輸出格式。用戶輸入的數據在包含form[「firstName」].value,form[「lastName」].value,和 form[「position」].value的語句中可以得到。那些中括弧中的名稱和/var/www/html/page2.html文本輸入域中定義的名稱參數一致。當網頁上的」Submit」按鈕被點擊,下面的網頁將被返回。這個例子的要點就是你可以很容易地讀取並顯示用戶在web表單上輸入的數據。除了以字元串的方式處理數據,你也可以用Python將用戶輸入的數據轉化為可用於數值計算的數字。結論本教程演示了如何使用Python CGI腳本創建網頁並處理用戶在網頁表單輸入的數據。查閱更多關於Apache CGI腳本的信息,點擊這里。查閱更多關於Python cgi模塊的信息,點擊這里。如何創建和使用Python CGI腳本