本文介绍了在Pythonexe中调用子进程脚本的最佳方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我目前正在尝试创建一个跨平台的Python exe文件,该文件依赖于调用其他的Python和R脚本。我面临的一个问题是,我的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 file。接下来,在将它们与上述函数一起使用时,准备该文件的路径。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
函数。
这篇关于在Pythonexe中调用子进程脚本的最佳方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!