[英]Best way to call subprocess scripts in a Python exe
我目前正在嘗試制作一個依賴於調用其他Python和R腳本的跨平台Python exe文件。 我面臨的一個問題是我的exe文件期望我的腳本文件位於根目錄中,而不是我的exe文件所在的目錄中。 我已經通過執行以下操作來解決此問題
if getattr(sys, 'frozen', False):
PROJECT_ROOT = sys.executable
else:
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
pwd = os.path.dirname(PROJECT_ROOT)
# messagebox is for the tkinter based GUI
messagebox.showinfo('Info', 'Please wait a moment')
subprocess.call(['python', pwd + '/Customs.py'], shell = False)
subprocess.call(['Rscript', pwd + '/r_script.R'], shell=False)
subprocess.call(['python', pwd + '/by_month.py'], shell = False)
messagebox.showinfo('Info', 'Processing completed)
我想知道是否有一種更清潔/更可靠的方法來減少發生可能破壞軟件的錯誤的可能性。
我還應該提到,我已經閱讀了一些有關將其他腳本首先轉換為exe文件的內容,並且我想聽聽您對此的看法。
謝謝
首先,我建議您使用一個函數來將文件作為凍結腳本運行或正常運行時返回文件的當前路徑,以使代碼測試變得容易。
其次,如果要捆綁腳本文件,則需要先將文件和可執行文件捆綁為DATA文件 。 接下來,將其與所述功能結合使用時,為該文件准備路徑。
def app_path():
if getattr(sys, 'frozen', False):
app_path = os.path.dirname(sys.executable)
elif __file__:
app_path = os.path.dirname(__file__)
return app_path
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
# messagebox is for the tkinter based GUI
messagebox.showinfo('Info', 'Please wait a moment')
subprocess.call(['python', resource_path('Customs.py')], shell=False)
subprocess.call(['Rscript', resource_path('r_script.R')], shell=False)
subprocess.call(['python', resource_path('by_month.py')], shell=False)
messagebox.showinfo('Info', 'Processing completed)
您構建應用程序的命令將如下所示:
pyinstaller -F --add-data "Customs.py;." --add-data "r_script.R;." --add-data "by_month.py;." myscript.py
當你的應用程序運行,數據文件Customs.py
, r_script.R
等將被抽取到一個臨時文件夾和resource_path
將返回的確切路徑每個文件。 但是請記住,如果要從當前目錄(exe文件所在的位置)加載某些文件,則可以使用app_path
函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.