- 1、如何將調試器附加到python子進程
- 2、python遍歷目錄就是這麼簡單
- 3、如何讓 Python 代碼常駐在服務器進程中
從“調試”菜單中選擇“附加到進程”。(如果沒有打開任何項目,請從“工具”菜單中選擇“附加到進程”。)
在“附加到進程”對話框的“可用進程”列表中,找到要附加到的程序。
如果要調試的程序運行在另一台計算器上,必須首先選擇該遠程計算機。(有關更多信息,請參見
。)如果進程在其他用戶帳戶下運行,請選中“顯示來自所有用戶的進程”框。
如果已通過“遠程桌面連接”連接,請選中“顯示所有會話中的進程”框。
在“附加到”框中,確保要調試的代碼類型已列出,或“自動: 託管代碼”已顯示。否則:
單擊“選擇”。
在“選擇代碼類型”對話框中,單擊“調試以下代碼類型”,然後選擇要調試的類型。
單擊“確定”。
單擊“附加”按鈕。
打開“進程”對話框時,會自動顯示“可用進程”列表。對話框打開時進程仍能在後台中開始和停止,因此內容可能並非始終是最新內容。通過按“刷新”,可以隨時刷新列表以查看當前進程列表。
調試時可以附加到多個程序,但在任何給定時間,調試器中只有一個程序處於活動狀態。可以在“調試位置”工具欄中設置活動程序。有關更多信息,請參見
所有的“調試”菜單執行命令都會影響活動程序。可以通過“進程”對話框中斷任何已調試的程序。有關更多信息,請參見
注意為使調試器附加到用 Visual C++ 編寫的代碼,該代碼需要發出
DebuggableAttribute
。可通過鏈接
/ASSEMBLYDEBUG
鏈接器選項將它自動添加到代碼中。
注意如果試圖附加到不受信任的用戶帳戶擁有的進程,則會出現安全警告對話框確認。有關更多信息,請參見
安全警告:附加到不受信任的進程可能會有危險。
注意在某些情況下,在“終端服務”(“遠程桌面”)會話中進行調試時,“可用進程”列表不會顯示所有可用進程。在 Windows Server 2003 或更高版本上,如果您以受限用戶身份運行 Visual Studio,則“可用進程”列表不會顯示在會話 0 中運行的進程,會話 0 用於服務以及包括 w3wp.exe 在內的其他服務器進程。您可以通過以下方法解決該問題:使用管理員帳戶運行 Visual Studio 或從服務器控制台而不是“終端服務”會話運行 Visual Studio。如果這兩種解決方法都不奏效,第三種方法是通過從 Windows 命令行運行
vsjitdebugger.exe -pProcessId來附加到進程。您可以使用 tlist.exe 來確定進程 ID。
有時我們有列出目錄下都有哪些文件和子目錄的需求,這種情況是有現成命令可用的,比如windows下的dir命令,linux下的ls命令都可以,那我們用python代碼怎麼實現呢?
我們利用python豐富的庫很容易就能實現一個簡易版本,下面我們就用4種方法來實現它。
一、使用os.popen
os.popen工作原理是新建一個子進程,然後用這個子進程執行命令,父進程與子進程間通過管道進行通信。
根據調用popen時的傳參,我們可以通過管道讀取子進程的輸出也可以向子進程寫數據,默認是讀取子進程的輸出。
從以上描述可以看出popen是非常通用的,不是只能用於我們這個例子哦。
那我們開始用它實現我們的需求吧,代碼如下:
哈哈,是不是很簡單,這種方式雖然能達到目的但其實並不是我們想要的,我們本來就是要實現ls的,結果調用了ls,所以嚴格意義上來說我們並沒有實現ls,那讓我們繼續往下看其它方法吧,嘿嘿。
二、使用glob.glob
glob可以根據你使用的通配符對文件進行匹配,利用這個特性我們可以列出當前目錄下都有哪些文件和子目錄,如下代碼:
三、使用os.listdir
os.listdir同樣可以列出某個目錄下都有哪些文件和子目錄,如下代碼:
四、使用os.walk
os.walk在遍歷目錄方面非常強大,它不但可以遍歷你需要的目錄,也可以遞歸遍歷子目錄且遞歸的深度可以用代碼控制,下面讓我們分別看下怎麼遍歷整個目錄樹以及怎麼控制深度吧。
os.walk默認是遍歷整個目錄樹的,如下代碼就會遞歸打印出當前目錄下所有文件:
那我們怎麼控制遍歷的深度,比如只遍歷n層呢?其實很簡單,只需要定義一個深度變量,然後到達n後跳出循環即可,如下代碼就只遍歷1層:
至此我們已經寫完4種方法了,如果你還有其他方法,歡迎評論交流。
一、nohup
nohup,即 no hangup,nohup 的用途就是讓提交的命令忽略 hangup 信號,從而使我們的進程避免中途被中斷。它可以讓 python 腳本和服務器連接端的 session 分離,以達到退出後依舊執行:
$ chmod +x /your_path/yourscript.py # 先設置可執行權限$ nohup python /your_path/yourscript.py# 切記退出的 Terminal 的時候,不要 ctrl+c 退出,而是直接關閉,不然 Nohup 就被你關閉了。
如何關閉這個一直執行的進程呢:
# 找到對應的進程 PID
$ ps -ef | grep python
# 返回內容如:
user 2430 1 0 Jul03 ? 00:00:01 /usr/bin/python -tt /usr/sbin/yum-updatesd
# kill 掉該進程即可:
$ kill -9 2430
PS:nohup 在服務器重啟之後就失效了,所以並不完美。
二、將命令寫入 Linux 啟動腳本
Linux 在啟動的時候會執行 /etc/rc.local 裡面的腳本,所以只要在這裡添加執行命令就可以:
$ vim /etc/rc.local
# 如果是 Centos 添加以下內容:
/your_path/python3.4 /your_path/yourscript.py
# 以上內容需要添加在 exit 命令前,而且由於在執行 rc.local 腳本時,PATH 環境變量未全部初始化,因此命令需要使用絕對路徑。
PS:這種方式的缺點是如果腳本掛了,那麼不會自動重新啟動。
三、使用 Supervisor 進程管理工具
詳見這篇文章:使用 Supervisor 管理服務器後台進程,在服務器重啟和腳本出錯後,可以完美重啟,推薦。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126292.html