在Pythonexe中调用子进程脚本的最佳方式

Best way to call subprocess scripts in a Python exe(在Pythonexe中调用子进程脚本的最佳方式)
本文介绍了在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.pyr_script.R等将被解压缩到临时文件夹中,并且resource_path将返回每个文件的确切路径。但请记住,如果要从当前目录(exe文件所在的目录)加载一些文件,可以使用app_path函数。

这篇关于在Pythonexe中调用子进程脚本的最佳方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)