【问题标题】:Best way to call subprocess scripts in a Python exe在 Python exe 中调用子进程脚本的最佳方法
【发布时间】:2019-06-12 14:22:23
【问题描述】:

我目前正在尝试制作一个依赖于调用其他 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 文件的内容,我想听听您对此的看法。

谢谢

【问题讨论】:

    标签: python directory subprocess pyinstaller


    【解决方案1】:

    首先我建议您使用一个函数,在文件作为冻结脚本运行或正常运行时返回文件的当前路径,以便轻松测试您的代码。

    其次,如果您想捆绑脚本文件,您需要首先将您的文件与可执行文件捆绑为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 函数。

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2011-03-26
      • 1970-01-01
      • 2015-07-16
      • 2015-06-22
      • 2012-07-31
      相关资源
      最近更新 更多