1. python代碼的執行入口是哪
python沒有C語言的main函數這樣的執行入口,它是順序執行的。
2. python代碼 怎麼 開始執行,從什麼位置開始的
python代碼是順序執行的,是自上而下的,它沒有類似C的main函數這樣的入口函數。
3. 這個python程序的入口在哪
可以自己定義入口(main)
在代碼最後面加上
if__name__=='__main__':
M=Macro()#實例化類文件
M.ExecuteBlock()#調用類文件的方法
這個實際上類似於C 或者 java 的main()
假設這個文件叫做mac.py
命令行里執行
pythonmac.py
#就會執行if__name__=='__main__':下面的代碼
4. Python程序代碼混淆、編譯、打包、運行(桌面程序防破解向)
像Python這種解釋性的語言,要想私有化部署的同時又保護好源碼,就像是對於魚和熊掌的追求。
雖然做不到盡善盡美,但是對代碼進行混淆,增加一點破解的難度,或許能規避一些泄露的風險。
本次演示環境:linux
確保要發布的包根目錄("demo")中有__main__.py文件,這個是程序執行入口。
編譯
批量改名.pyc文件
移動.pyc文件
清理.py文件
清理__pycache__文件夾
打包成zip
運行時只要將zip文件作為參數即可
最終整合腳本
調用方式
對於在變數和函數名上的混淆有點小兒科,而對於跨文件的類名的混淆又太容易實現。
所以對於混淆程度的取捨,要視工程的規模而定。
2.1 混淆工具pyminifier
在原來的工具 pyminifier上修復了幾個bug。
安裝:
python3 安裝
或者clone下來,自行安裝
使用例子
2.2 源碼變更
不同的配置對於源碼的要求不同,以下是筆者踩過的坑。
其他混淆想法
結合混淆、編譯和打包,嘗試出以下發布腳本。
主要的思路 :創建一個工作目錄tmp,然後在此目錄下混淆、編譯python代碼,完成後把內容打包成pyc文件,再將pyc文件和其他配置文件移動到dist,發布dist即可。
混淆的目的是最大程度保護源碼,在發布到客戶端後不被輕易破解。
5. python 生成的exe 怎麼運行
Python是一種簡單而強大的編程語言,適用於編寫腳本,甚至於應用程序的開發。Python可用的各種GUI包使得利用Python編寫全功能的應用變為可能。這很好,但你有沒有想過將你編寫的Python腳本轉化為可執行文件?這似乎是一個很贊的主意,有許多原因!你可以在沒有Python解釋器的情況下重新部署你的應用。終端用戶不需要在他的機器上安裝Python。你可以將你的應用閉源(很不幸)等等……這篇文章可以告訴你如何從你的Python腳本生成win32可執行文件。
Python is a simple and powerful language for scripting and even application development. Various GUI packages available for Python makes it suitable for developing full fledged applications in python. Ok that is fine, but ever thought of creating an executable file from the python script you wrote? This seems to be a nice idea, there are many reasons why! You can redistribute your application without python. The end user needn't to install python on his machine. You can make your application closed source (unfortunate) etc... Read on this article to find how you can create win32 executables from your Python script.
This tutorial will give step by step instruction on how to create Win32 executable from Python script. Make sure that the following are installed on your system.
這篇教程將會一步一步的介紹如何從Python腳本創建Win32可執行文件。請確保你的系統里已經安裝了下面的程序。
Python. Get Python fromh and install on your machine.
py2exe. Get py2exe from 下載時注意安裝的Python版本。
命令行程序
下面的示例代碼會在命令行里列印一行標題,以及從1到10的數字。
test.py
print "Python script to exe test program"count = 0while count < 10:print "count = " + str(count) +"
"count = count + 1123456
把這段代碼保存在test.py(或者別的以.py為後綴的)文件中。用Python解釋器首先測試並成功運行這段代碼。要完成這一步,只需要在命令行里輸入「python test.py」。你應當在命令行里看到下面的輸出。
目前為止一切順利。現在讓我們看看我們怎樣從腳本構建windows可執行程序。創建一個新文件命名為setup.py並將下面的代碼粘貼進去。
setup.py
from distutils.core import setupimport py2exe
setup(console=['gui.py'])123
構建可執行文件時,在命令提示符里運行「python setup.py py2exe」。一旦構建過程完成,移動到dist子目錄下並通過在命令行里鍵入「gui.exe」來運行這個可執行文件。現在你應該看到與前面用Python腳本創建的一樣的窗體。
6. 在Python中定義Main函數
目錄
許多編程語言都有一個特殊的函數,當操作系統開始運行程序時會自動執行該函數。這個函數通常被命名為main(),並且依據語言標准具有特定的返回類型和參數。另一方面,Python解釋器從文件頂部開始執行腳本,並且沒有自動執行的特殊函數。
盡管如此,為程序的執行定義一個起始點有助於理解程序是如何運行的。Python程序員提出了幾種方式對此進行實現。
本文結束時,您將了解以下內容:
Python中的基本main()函數
一些Python腳本中,包含一個函數定義和一個條件語句,如下所示:
此代碼中,包含一個main()函數,在程序執行時列印Hello World!。此外,還包含一個條件(或if)語句,用於檢查__name__的值並將其與字元串"__main__"進行比較。當if語句為True時,Python解釋器將執行main()函數。更多關於Python條件語句的信息可以由此獲得。
這種代碼模式在Python文件中非常常見,它將作為腳本執行並導入另一個模塊。為了幫助理解這段代碼的執行方式,首先需要了解Python解釋器如何根據代碼的執行方式設置__name__。
Python中的執行模式
Python解釋器執行代碼有兩種方式:
更多內容可參考如何運行Python腳本。無論採用哪種方式,Python都會定義一個名為__name__的特殊變數,該變數包含一個字元串,其值取決於代碼的使用方式。
本文將如下示例文件保存為execution_methods.py,以 探索 代碼如何根據上下文改變行為:
在此文件中,定義了三個對print()函數的調用。前兩個列印一些介紹性短語。第三個print()會先列印短語The value __name__ is,之後將使用Python內置的repr()函數列印出__name__變數。
在Python中,repr()函數將對象轉化為供解釋器讀取的形式。上述示例通過使用repr()函數來強調__name__的值為字元串。更多關於repr()的內容可參考Python文檔。
在本文中,您將隨處可見文件(file),模塊(mole)和腳本(script)這三個字眼。實際上,三者之間並無太大的差別。不過,在強調代碼目的時,還是存在細微的差異:
「如何運行Python腳本」一文也討論了三者的差別。
基於命令行執行
在這類方法中,Python腳本將通過命令行來執行。
執行腳本時,無法與Python解釋器正在執行的代碼交互。關於如何通過命令行執行代碼的詳細信息對本文而言並不重要,但您可以通過展開下框閱讀更多有關Windows,Linux和macOS之間命令行差異的內容。
命令行環境
不同的操作系統在使用命令行執行代碼時存在細微的差異。
在Linux和macOS中,通常使用如下命令:
美元符號($)之前的內容可能有所不同,具體取決於您的用戶名和計算機名稱。您鍵入的命令位於$之後。在Linux或macOS上,Python3的可執行文件名為python3,因此可以通過輸入python3 script_name.py來運行python腳本。
在Windows上,命令提示符通常如下所示:
根據您的用戶名,>之前的內容可能會有所不同,您輸入的命令位於>之後。在Windows上,Python3的可執行文件通常為python。因此可以通過輸入python script_name.py來運行python腳本。
無論哪種操作系統,本文的Python腳本的輸出結果都是相同的。因此本文以Linux和macOS為例。
使用命令行執行execution_methods.py,如下所示:
在這個示例中,__name__具有值'__main__',其中引號(')表明該值為字元串類型。
請記住,在Python中,使用單引號(')和雙引號(")定義的字元串沒有區別。更多關於字元串的內容請參考Python的基本數據類型。
如果在腳本中包含"shebang行"並直接執行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,將會獲取相同的結果。
您還可以通過向命令行添加-m參數的方法實現以模塊的方式執行。通常情況下,推薦如下方式pip: python3 -m pip install package_name。
添加-m參數將會運行包中__main__.py的代碼。更多關於__main__.py文件的內容可參考如何將開源Python包發布到PyPI中。
在三種情況中,__name__都具有相同的值:字元串'__main__'。
技術細節:Python文檔中具體定義了__name__何時取值為'__main__'。
當通過標准輸入,腳本或者交互提示中讀取數據時,模塊的__name__將取值為'__main__'。(來源)
__name__與__doc__,__package__和其他屬性一起存儲在模塊的全局命名空間。更多關於屬性的信息可參考Python數據模型文檔,特別是關於模塊和包的信息,請參閱Python Import文檔。
導入模塊或解釋器
接下來是Python解釋器執行代碼的第二種方式:導入。在開發模塊或腳本時,可以使用import關鍵字導入他人已經構建的模塊。
在導入過程中,Python執行指定模塊中定義的語句(但僅在第一次導入模塊時)。要演示導入execution_methods.py文件的結果,需要啟動Python解釋器,然後導入execution_methods.py文件:
在此代碼輸出中,Python解釋器執行了三次print()函數調用。前兩行由於沒有變數,在輸出方面與在命令行上作為腳本執行時完全相同。但是第三個輸出存在差異。
當Python解釋器導入代碼時,__name__的值與要導入的模塊的名稱相同。您可以通過第三行的輸出了解這一點。__name__的值為'execution_methods',是Python導入的.py文件。
注意如果您在沒有退出Python時再次導入模塊,將不會有輸出。
注意:更多關於導入在Python中如何工作的內容請參考官方文檔和Python中的絕對和相對導入。
Main函數的最佳實踐
既然您已經了解兩種執行方式上的差異,那麼掌握一些最佳實踐方案還是很有用的。它們將適用於編寫作為腳本運行的代碼或者在另一個模塊導入的代碼。
如下是四種實踐方式:
將大部分代碼放入函數或類中
請記住,Python解釋器在導入模塊時會執行模塊中的所有代碼。有時如果想要實現用戶可控的代碼,會導致一些副作用,例如:
在這種情況下,想要實現用戶控制觸發此代碼的執行,而不是讓Python解釋器在導入模塊時執行代碼。
因此,最佳方法是將大部分代碼包含在函數或類中。這是因為當Python解釋器遇到def或class關鍵字時,它只存儲這些定義供以後使用,並且在用戶通知之前不會實際執行。
將如下代碼保存在best_practices.py以證明這個想法:
在此代碼中,首先從time模塊中導入sleep()。
在這個示例中,參數以秒的形式傳入sleep()函數中,解釋器將暫停一段時間再運行。隨後,使用print()函數列印關於代碼描述的語句。
之後,定義一個process_data()函數,執行如下五項操作:
在命令行中執行
當你將此文件作為腳本用命令行執行時會發生什麼呢?
Python解釋器將執行函數定義之外的from time import sleep和print(),之後將創建函數process_data()。然後,腳本將退出而不做任何進一步的操作,因為腳本沒有任何執行process_data()的代碼。
如下是這段腳本的執行結果:
我們在這里看到的輸出是第一個print()的結果。注意,從time導入和定義process_data()函數不產生結果。具體來說,調用定義在process_data()內部的print()不會列印結果。
導入模塊或解釋器執行
在會話(或其他模塊)中導入此文件時,Python解釋器將執行相同的步驟。
Python解釋器導入文件後,您可以使用已導入模塊中定義的任何變數,類或函數。為了證明這一點,我們將使用可交互的Python解釋器。啟動解釋器,然後鍵入import best_practices:
導入best_practices.py後唯一的輸出來自process_data()函數外定義的print()。導入模塊或解釋器執行與基於命令行執行類似。
使用__name__控制代碼的執行
如何實現基於命令行而不使用Python解釋器導入文件來執行呢?
您可以使用__name__來決定執行上下文,並且當__name__等於"__main__"時才執行process_data()。在best_practices.py文件中添加如下代碼:
這段代碼添加了一個條件語句來檢驗__name__的值。當值為"__main__"時,條件為True。記住當__name__變數的特殊值為"__main__"時意味著Python解釋器會執行腳本而不是將其導入。
條件語塊內添加了四行代碼(第12,13,14和15行):
現在,在命令行中運行best_practices.py,並觀察輸出的變化:
首先,輸出顯示了process_data()函數外的print()的調用結果。
之後,data的值被列印。因為當Python解釋器將文件作為腳本執行時,變數__name__具有值"__main__",因此條件語句被計算為True。
接下來,腳本將調用process_data()並傳入data進行修改。當process_data執行時,將輸出一些狀態信息。最終,將輸出modified_data的值。
現在您可以驗證從解釋器(或其他模塊)導入best_practices.py後發生的事情了。如下示例演示了這種情況:
注意,當前結果與將條件語句添加到文件末尾之前相同。因為此時__name__變數的值為"best_practices",因此條件語句結果為False,Python將不執行process_data()。
創建名為main()的函數來包含要運行的代碼
現在,您可以編寫作為腳本由從命令行執行並導入且沒有副作用的Python代碼。接下來,您將學習如何編寫代碼並使其他程序員能輕松地理解其含義。
許多語言,如C,C++,Java以及其他的一些語言,都會定義一個叫做main()的函數,當編譯程序時,操作系統會自動調用該函數。此函數通常被稱為入口點(entry point),因為它是程序進入執行的起始位置。
相比之下,Python沒有一個特殊的函數作為腳本的入口點。實際上在Python中可以將入口點定義成任何名稱。
盡管Python不要求將函數命名為main(),但是最佳的做法是將入口點函數命名為main()。這樣方便其他程序員定位程序的起點。
此外,main()函數應該包含Python解釋器執行文件時要運行的任何代碼。這比將代碼放入條件語塊中更好,因為用戶可以在導入模塊時重復使用main()函數。
修改best_practices.py文件如下所示:
在這個示例中,定義了一個main()函數,它包含了上面的條件語句塊。之後修改條件語塊執行main()。如果您將此代碼作為腳本運行或導入,將獲得與上一節相同的輸出。
在main()中調用其他函數
另一種常見的實現方式是在main()中調用其他函數,而不是直接將代碼寫入main()。這樣做的好處在於可以實現將幾個獨立運行的子任務整合。
例如,某個腳本有如下功能:
如果在單獨的函數中各自實現這些子任務,您(或其他用戶)可以很容易地實現代碼重用。之後您可以在main()函數中創建默認的工作流。
您可以根據自己的情況選擇是否使用此方案。將任務拆分為多個函數會使重用更容易,但會增加他人理解代碼的難度。
修改best_practices.py文件如下所示:
在此示例代碼中,文件的前10行具有與之前相同的內容。第12行的第二個函數創建並返回一些示例數據,第17行的第三個函數模擬將修改後的數據寫入資料庫。
第21行定義了main()函數。在此示例中,對main()做出修改,它將調用數據讀取,數據處理以及數據寫入等功能。
首先,從read_data_from_web()中創建data。將data作為參數傳入process_data(),之後將返回modified_data。最後,將modified_data傳入write_data_to_database()。
腳本的最後兩行是條件語塊用於驗證__name__,並且如果if語句為True,則執行main()。
在命令行中運行如下所示:
根據執行結果,Python解釋器在執行main()函數時,將依次執行read_data_from_web(),process_data()以及write_data_to_database()。當然,您也可以導入best_practices.py文件並重用process_data()作為不同的數據輸入源,如下所示:
在此示例中,導入了best_practices並且將其簡寫為bp。
導入過程會導致Python解釋器執行best_practices.py的全部代碼,因此輸出顯示解釋文件用途的信息。
然後,從文件中存儲數據而不是從Web中讀取數據。之後,可以重用best_practices.py文件中的process_data()和write_data_to_database()函數。在此情況下,可以利用代碼重寫來取代在main()函數中實現全部的代碼邏輯。
實踐總結
以下是Python中main()函數的四個關鍵最佳實踐:
結論
恭喜!您現在已經了解如何創建Python main()函數了。
本文介紹了如下內容:
現在,您可以開始編寫一些非常棒的關於Python main()函數代碼啦!
7. python如何運行程序
安裝並配置完成之後,我們就可以編寫第一個python程序。學過其他語言的兄弟姐妹們,都知道語言的入門程序就是hello world。那麼,我們這里也以hello world來拋磚引玉,打開python學習的大門。
python運行有兩種方式,一種是在python互動式命令行下運行;另一種是使用文本編輯器,在命令行中直接運行。
注意:以上兩種運行方式,都是以CPython解釋器來編譯運行的。當然也可以將python代碼寫入到eclipse中,使用JPython解釋器運行,需要自己配置環境。(推薦學習:Python視頻教程)
一、命令行與互動式命令行
首先要搞清楚這個命令行的概念。
1.命令行
定義:出現類似「C:\>」,則是在Windows提供的命令行模式
進入模式的方式:Windows中,直接win+r鍵進入
2.互動式命令行
定義:出現「>>>」,則是python的互動式命令行
進入模式的方式:Windows命令行中輸入python即可
二、互動式命令行中運行python代碼
cmd窗口中,輸入python後,進入python互動式命令行。直接輸入代碼:
print 『hello world!』
python-23.png
可以看到界面上運行結果,表示運行成功!
在Python的互動式命令行寫程序,好處是一下就能得到結果,壞處是沒法保存,下次還想運行的時候,還得再敲一遍。
所以,實際開發的時候,我們總是使用一個文本編輯器來寫代碼,寫完了,保存為一個文件,這樣,程序就可以反復運行了。
三、命令行運行python代碼
1.python代碼編寫及保存
我們將「hello world!」程序用文本編輯器寫出來,保存下來,並命名,這里我們命名為hello.py,保存到F:\workspace。
命名時,要注意:
1)文件要以.py結尾,其他都不可以
2)文件名只能是英文字母、數字和下劃線的組合。
文本編輯器推薦:Notepad++、Sublime Text
2.python代碼運行
在命令行模式中,輸入python F:\workspace\hello.py,即可運行成功。
運行時,要注意:
1)python文件存儲路徑是相對路徑,運行時,一定要說明python文件的存儲路徑,
當然,用Python開發程序,完全可以一邊在文本編輯器里寫代碼,一邊開一個互動式命令窗口,在寫代碼的過程中,把部分代碼粘到命令行去驗證,事半功倍!
8. python語言中有類似C語言或者java中程序執行時的入口方法main(),如果沒有那麼它是怎麼執行的呢
沒有,python是解釋型的語言,
看見第一個可以被執行的語句就順序執行。
比如
def abc(ab): #這是函數,沒調用沒執行。
print ab
ddd="abcdefg" #賦值語句,執行
print ddd #在標准輸出上輸出ddd的內容,執行
abc(ddd) 函數調用執行。