在Xcode專案中執行Python檔案

janzyxcode發表於2018-01-15

為什麼要扯到在Xcode的專案中執行python檔案,是因為寫的一個搶票軟體搶票邏輯是使用python編寫,UI部分是使用Xcode寫的mac端。剛開始mac端和python檔案之間的互動不是實時的,自己剛開始學python,所以這一塊就更麻煩了,導致剛開始的思路是mac端用Timer在某個點重新整理配置檔案,這就有點要吐血了。

一、思路-->跳一跳助手

前一段時間下載了別人的跳一跳的輔助助手指令碼,那個指令碼檔案裡有import cv2,在終端直接使用python命令執行指令碼檔案就能直接執行。基於這個助手的思路,Xcode有提供API能執行指令碼檔案且不用improt cv2 或是其他第三方模組,那上面的問題就迎刃而解了。

二、動手

google了一會,發現NSTask和system不時地被提到,在mac端試著執行了程式碼system(path),xcode提示我swift3適用Process,那就去解了下如何使用Process唄,第一次使用的時候程式碼如下:

    let task = Process()
    task.launchPath = "/usr/bin/python"
    task.arguments = ["/Users/**/Desktop/TestPython/pythonFile/main.py"]
    task.launch()
複製程式碼

三、報錯

報錯的提示 No module such as requests,也就是說這麼執行不能自動import 第三方module,google的找思路過程中突然想到,公司電腦裡該專案的Python interpreter是自己根據網上的教程建立的一個venv資料夾裡的python版本,上面的程式碼中task的launchPath是"/usr/bin/python",這不難看出是安裝python時自動建立的目錄,進入該目錄看到該檔案圖示是這樣的:

在Xcode專案中執行Python檔案
有沒有像終端的圖示?launch on this path,將自動安裝的後在系統目錄的python檔案或是虛擬環境的python檔案給了launchpath。

四、再次嘗試

再次執行,在xcode的console裡面看到了該python檔案裡面的print引數,好吧,終於能在xcode程式碼裡執行python檔案了。

五、收尾

最後一個問題,如何知道執行結束了?進入Process API,發現了didTerminateNotification這麼個常量,好吧,是通知的形式,也有terminationHandler: ((Process) -> Void)? 這樣的block形式,有個人的經驗是這樣的,如何知道那個是哪個Process完成了呢,很簡單:

@objc func taskTerminated(_ noti:NSNotification){
        if let task = noti.object as? Process {
            print(task.arguments)
        }
    }
複製程式碼

Done.

Tips: 1.第一次launch有點慢。 2.python裡的os.getcwd()在xcode裡執行會是xcode app的相對路徑,所以要注意啦。 3.貌似fackbook的那個框架好像能做一些好玩的東西

參考文章:

Mac OSX 開發入門基礎系列之NSTask

我用Xcode +python寫的第一個OS X app

NSTask Tips (Swift)

virtualenv

如何在 Swift 3.0 中使用 Process 呼叫外部命令

教你如何用Swift編寫Xcode外掛

相關文章