GVKun编程网logo

如何使Python脚本成为可执行程序(python将脚本生成可执行文件)

17

这篇文章主要围绕如何使Python脚本成为可执行程序和python将脚本生成可执行文件展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何使Python脚本成为可执行程序的优缺点,解答python

这篇文章主要围绕如何使Python脚本成为可执行程序python将脚本生成可执行文件展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何使Python脚本成为可执行程序的优缺点,解答python将脚本生成可执行文件的相关问题,同时也会为您带来IDA 配置python环境,可执行python脚本、Linux(CentOS)下把python脚本转化成可执行程序、PyInstaller打包Python源文件为可执行程序exe、PyInstaller把Python脚本打包成可执行程序教程的实用方法。

本文目录一览:

如何使Python脚本成为可执行程序(python将脚本生成可执行文件)

如何使Python脚本成为可执行程序(python将脚本生成可执行文件)

需要明确的是,不仅要“运行python脚本”,还要使我的python脚本成为可以在其他编程语言或平台中使用的“可执行”或“可调用”程序。可能更像API。

问题是我在Java中实现了几种算法,并且numpy和spipy支持它们,但是其他人希望在其Java程序中调用我的python程序。

那么,numpy和spipy就是问题。它们不能在Java和Jython中…

有没有一种解决方案,我可以使它成为其他人不需要环境而只需要在接受几个参数的情况下运行的可执行程序?

答案1

小编典典

如果只需要使python程序可执行,则可以在顶部添加一行,如下所示:

   #!/usr/bin/python

将/ usr / bin / python替换为python的文件路径,可以通过键入以下内容获得

    which python

假设您使用的是基于Unix的系统,请进入终端。

然后,您可以告诉操作系统该程序可执行

    chmod +x nameofprogram

如果Java程序需要的不仅是将python部分作为可执行文件运行,还需要更复杂的东西,那么您可能需要向任何人提供更多信息,以便能够为您提供帮助。

IDA 配置python环境,可执行python脚本

IDA 配置python环境,可执行python脚本

注意事项

下面几点关系到安装是否成功

  1. IDA必须是安装版的,我以前用的是免安装版的。
  2. python版本、IDA版本,IDAPyhton版本必须匹配。
  3. python、IDA、IDAPython必须都是32位的或者都是64位的。

安装关键点

下面这些东西必备,缺一不可:

  1. python27.dll(我安装的是python2.7,如果安装的是pyhton2.6那就是python26.dll)。
  2. python.cfg文件。
  3. plugins中的python.plw和python.p64。
  4. python文件夹里的文件。

具体安装步骤

首先我的IDA的版本是6.8。

  1. 机器上安装了Python,到Python的官网—http://www.python.org/getit/下载一个2.6或者2.7的安装包。注意对应操作系统类型及位数。
  2. 到github上面下载相应版本的IDAPython,注意IDA版本和Python版本都要和自己机器上安装的版本相对应。这是地址—https://github.com/idapython/bin
  3. 将IDAPython解压后的Python文件夹内的所有内容覆盖掉IDA原有Python文件夹(IDA安装目录下)下面的内容。
  4. 将IDAPython解压后的Plugins文件夹的python.plw和python.p64拷贝到IDA原有Plugins文件夹(自定义,一般IDA安装目录下)下。
  5. 将IDAPython解压后的python.cfg文件拷贝到IDA原有cfg文件夹(IDA安装目录下)下。
  6. 把python安装目录下的python27.dll复制到IDA安装目录下。如果python2.7安装包里没有pyhton27.dll那么可以找一个Python26.dll改为python27.dll也是可以的。但是要注意python的系统位数要和IDAPython的系统位数相同。

效果

重启IDA,就可以了。效果是:File菜单下面会有Python Command选项,而且Script files选项中可以选择py文件。
效果图:

出现Python Command选项

Script files选项中可以选择py文件

python脚本可以运行

Linux(CentOS)下把python脚本转化成可执行程序

Linux(CentOS)下把python脚本转化成可执行程序

   原文来自http://blog.csdn.net/inte_sleeper/article/details/6614182

 

1. pyinstaller

安装pyinstaller:

wgethttp://www.pyinstaller.org/static/source/1.5/pyinstaller-1.5.tar.bz2

tarjvxf pyinstaller-1.5.tar.bz2

./Configure.py

 

打包程序:

先运行:

./Makespec.py–onefile yourprogram.py

默认会在当前目录下生成一个spec文件。

--onefile选项指定只生成单一的目标可执行文件。如果不指定这个选项,则会同时生成一堆的依赖库。

 

./Build.pyyourprogram.spec

即可以生成可执行程序。

 

更多可以参考:http://www.pyinstaller.org

 

 

2. cx_Freeze

cx_Freeze是一个跨平台的将python转换成可执行程序的项目。

项目主页:http://cx-freeze.sourceforge.net/

可以下载rpm包安装。

安装完以后只需要运行:

cxfreezeyourprogram.py

就会在当前目录生成一个dist的目录,里面包含了可执行程序以及依赖模块的库文件。

项目主页上说可以通过distutils的build_exe命令生成单一的可执行程序,不过貌似不行...所以这个相对于pyinstaller可能还是稍有不便。

 

更多可以参考:http://cx-freeze.sourceforge.net/cx_Freeze.html

PyInstaller打包Python源文件为可执行程序exe

PyInstaller打包Python源文件为可执行程序exe

1. 安装PyInstaller

 使用命令:pip install PyInstaller时可能会由于网络的问题出现以下问题:

 pip._vendor.urllib3.exceptions.ReadTimeoutError:HTTPSConnectionPool(host=''files.pythonhosted.org'', port=443): Read timed out.

 此时修改命令为:pip install --default-timeout=1000 PyInstaller

 问题未解决出现了其他问题,使用镜像下载也无法解决;

 问题解决:卸载pip,python -m pip uninstall pip,然后在pycharm的settings-project interpreter那里提示缺少文件,直接点击下载,下载的是旧版本pip10.0.1,再使用命令pip install PyInstaller安装成功;

# dos窗口执行以下命令
# 卸载pip
python -m pip uninstall pip
# 通过pycharm提示安装pip(这里会安装到旧版本10.0.0.1),或者到官网上下载pip再通过命令安装
# 此时安装PyInstaller成功
pip install PyInstaller

(旧版本升级提示使用该命令:python -m pip install --upgrade pip,但升级失败,仍旧提示升级,或者出现AttributeError: ''NoneType'' object has no attribute ''bytes'',这里使用网上给的方法:easy_install -U pip,第一次可能失败,多试几次,成功后使用pip show pip查看版本)

# pip升级
# 升级失败
python -m pip install --upgrade pip
# 改用命令,升级成功
easy_install -U pip
# 查看版本
pip show pip

2. 打包命令的参数

-i icofile:生一个带有图标的exe程序,图标必须是.ico的格式,图片转换成ico格式可以通过比特虫网站
-F:打包成一个独立的exe文件,否则是一个带各种dll和依赖的文件夹
-W:使用窗口界面,无控制台
-c:使用控制台,无窗口界面(小写的c)
-D:创建一个目录,里面包含exe及其他一些依赖性文件
pyinstaller -h:可以查看参数

3. 执行命令命令pyinstaller -F xxx.py

  cmd下,在哪个目录下运行该pyinstaller -F xxx.py命令,哪个目录下就会生产build和dist文件夹以及.spec文件,其中.exe文件在dist文件夹下;

  当打包目录和源代码目录不一致时,需要用绝对路径;

  打包后只需要exe文件即可,其他文件可删除,在没有python的环境下可以直接运行(因为pyinstaller打包了python解析器和脚本);

  针对下边这个源代码进行打包:

pyinstaller -F -c -i a.ico test.py
# -c需要终端输入
# 我一起放到了GitHub里了(是一个终端猜词小游戏):https://github.com/NoobZeng/GuessWords/blob/master/test.exe

  注意:图标的大小大小要适当,太大会报错:ValueError: read length must be non-negative or -1

4. 关于图标

  将图标从dist目录移到其他地方,如果是看到python样式的,需要移动一下位置;


PyInstaller把Python脚本打包成可执行程序教程

PyInstaller把Python脚本打包成可执行程序教程

一、说明

一直以来都有把.py文件打包成.exe文件的想法,但总是不够强烈,每次拖着拖着就淡忘了。

昨天帮硬件部门的同事写了个脚本,然后今天下午的时候,他问有没有办法把脚本打包成可执行文件,这样方便以后交给别人的时候别人不用装Python也能运行。

习惯性操作,百度一下,看到标题都基本使用PyInstaller,然后直接进官方文档。

 

二、打包操作

2.1 待打包文件

文件其实无所谓,随便使用一个正确的Python脚本文件即可。我这里直接使用给同事写好的文件tracer.py(其实主要是为了对这个脚本做个记录方便以后自己找,如果使用我这个需要安装openpyxl库)。

分享图片

分享图片

import logging
import os
import openpyxl

class MatterTracer():
    def __init__(self):
        self.config_dict = {
            # ERP导出文件存放目录
            "erp_xls_dir":"./ERP/",# ERP导出文件的表名
            "erp_xls_sheet_name": "sheet1",# ERP导出文件存货编号列
            "erp_part_number_column":"B",# ERP导出文件规格型号列
            "erp_description_column":"D",# ERP导出文件物料状态列
            "erp_approved_column":"E",# ERP导出文件物料实际起始行
            "erp_start_rank_no":2,# 本地维护文件存放目录
            "local_xls_dir":"./LOCAL/",# 最终文件输出目录
            "local_xls_save_dir":"./LOCAL_NEW/",# 本地维护文件的表名
            "local_xls_sheet_name": "Sheet1",# 本地维护文件存货编号列
            "local_part_number_column":"A",# 本地维护文件规格型号列
            "local_description_column": "D",# 本地维护文件物料状态列
            "local_approved_column": "H",# 本地维护文件物料实际起始行
            "local_start_rank_no":2,}
        # ERP导出文件清单
        self.erp_xls_list = ["IC.XLSX","插件.XLSX","贴片.XLSX"]
        # self.erp_xls_list = ["IC.XLSX",]
        # 本地维护文件清单
        self.local_xls_list = ["capacitor.xlsx","connector.xlsx","diode.xlsx","ic.xlsx","magnetic.xlsx","miscellaneous.xlsx","mosfet.xlsx","nonum.xlsx","protect.xlsx","resistor.xlsx"]
        # self.local_xls_list = ["capacitor.xlsx",]

    def tracer_follow(self):
        erp_xls_wbs = []
        local_xls_wbs = []
        # 反复打开文件是比较耗性能的,所以先统一打开ERP导出的文件
        for erp_xls_name in self.erp_xls_list:
            logging.warning(f"start to open {erp_xls_name}")
            erp_xls_wbs.append(openpyxl.load_workbook(f"""{self.config_dict["erp_xls_dir"]}{erp_xls_name}"""))

        # 反复打开文件是比较耗性能的,所以先统一打开本地维护的文件
        for local_xls_name in self.local_xls_list:
            logging.warning(f"start to open {local_xls_name}")
            local_xls_wbs.append(openpyxl.load_workbook(f"""{self.config_dict["local_xls_dir"]}{local_xls_name}"""))

        # 遍历所有从ERP导出的文件
        for erp_xls_wb in erp_xls_wbs:
            erp_xls_sheet = erp_xls_wb[self.config_dict["erp_xls_sheet_name"]]
            erp_rank_no = self.config_dict["erp_start_rank_no"]
            # 遍历ERP导出文件的所有行,以物料号为空作为结束标志
            while erp_xls_sheet[f"""{self.config_dict["erp_part_number_column"]}{erp_rank_no}"""].value is not None:
                # 遍历所有本地维护的文件
                # 是否找到匹配行的标志
                logging.warning(f"""{self.config_dict["erp_part_number_column"]}{erp_rank_no}: start to find match""")
                find_flag = False
                for local_xls_wb in local_xls_wbs:
                    local_xls_sheet = local_xls_wb[self.config_dict["local_xls_sheet_name"]]
                    local_rank_no = self.config_dict["local_start_rank_no"]
                    # 遍历本地文件的所有行,以物料号为空作为结束标志
                    while local_xls_sheet[f"""{self.config_dict["local_part_number_column"]}{local_rank_no}"""].value is not None:
                        # 如果ERP物料号与本地物料号相等
                        if erp_xls_sheet[f"""{self.config_dict["erp_part_number_column"]}{erp_rank_no}"""].value == local_xls_sheet[f"""{self.config_dict["local_part_number_column"]}{local_rank_no}"""].value:
                            local_xls_sheet[f"""{self.config_dict["local_description_column"]}{local_rank_no}"""].value = erp_xls_sheet[f"""{self.config_dict["erp_description_column"]}{erp_rank_no}"""].value
                            local_xls_sheet[f"""{self.config_dict["local_approved_column"]}{local_rank_no}"""].value = erp_xls_sheet[f"""{self.config_dict["erp_approved_column"]}{erp_rank_no}"""].value
                            find_flag = True
                            # 如果找到匹配行,则后续记录不用再继续找了
                            logging.warning(f"""{self.config_dict["erp_part_number_column"]}{erp_rank_no}({erp_xls_sheet[f‘{self.config_dict["erp_part_number_column"]}{erp_rank_no}‘].value}): found match""")
                            break
                        # 本地文件切换至下一行
                        # logging.warning(f"""{self.config_dict["erp_part_number_column"]}: not match with """)
                        local_rank_no += 1
                    # 如果找到匹配行,则后续文件不用再继续找了
                    if find_flag:
                        break
                # 如果退出文件遍历还是没找到匹配项
                if not find_flag:
                    logging.warning(f"""{self.config_dict["erp_part_number_column"]}{erp_rank_no}({erp_xls_sheet[f‘{self.config_dict["erp_part_number_column"]}{erp_rank_no}‘].value}): have no match""")
                # ERP文件切换至下一行
                erp_rank_no += 1

        # 如果保存的目录不是打开的目录,则先判断要保存的目录是否存在,不存在则先创建
        if self.config_dict["local_xls_save_dir"] != self.config_dict["local_xls_dir"]:
            logging.warning(f"""local_xls_save_dir {self.config_dict["local_xls_save_dir"]} is not local_xls_dir {self.config_dict["local_xls_dir"]}""")
            if not os.path.exists(self.config_dict["local_xls_save_dir"]):
                os.mkdir(self.config_dict["local_xls_save_dir"])

        # 遍历本地维护的所有文件
        flag = 0
        for local_xls_wb in local_xls_wbs:
            local_xls_wb.save(f"""{self.config_dict["local_xls_save_dir"]}{self.local_xls_list[flag]}""")
            flag += 1

        pass

if __name__ == "__main__":
    mt = MatterTracer()
    mt.tracer_follow()
View Code

 

2.2 安装PyInstaller

直接pip安装即可,其他依赖pip会自动安装上不用管。

pip install pyinstaller

 

2.3 基本打包操作

pyinstaller.exe位置:和习惯一样,安装PyInstaller库后,其对应的可执行文件(如果有)也后被放到Python环境的Scripts目录下。如果要使用要么使用全路径,要么把Scripts目录加入PATH环境变量,我这里已加入环境变量。

打包时直接pyinstaller带main函数入口所在python文件即可,如我这里就是(打包过程中360可能会告警注意放行一下即可):

pyinstaller tracer.py
# 默认文件放到一个目录下,但其实可通过以下形式,将所有文件都集合成一个exe文件
# 但实际操作又发现放到一个文件,logging等的打印都不在控制台输出,所以也并非那么好用
# pyinstaller --onefile --windowed tracer.py

分享图片

执行以上命令后,pyinstaller默认会在当前目录下:

创建与脚本文件同名的.spec文件(如我这里就是tracer.spec),该文件是pyinstaller分析脚本文件生成的打包指导文件,后边会根据该文件进行打包。

创建build目录(如果该目录不存在),该目录用于打包过程生成的临时文件,最终我们并不需要该目录。

创建dist目录(如果该目录不存在),该目录存放的就是最终打包出的结果,其下包括可执行文件及其依赖库。

分享图片

另外注意双击运行exe文件,和直接运行脚本文件是一样的,即代码需要读写的目录/文件也需要放到当前目录下来,不然运行报错。

分享图片

 

2.4 定制化打包操作【可选】

上边我们说打包其实是根据.spec文件的指导进行的,如果我们想做一些定制打包操作(比如指定生成的exe文件名),可以直接修改.spec文件,然后使用类似如下形式打包:

pyinstaller tracer.spec

 

三、一些说明

打包原理:PyInstaller读取给定的Python脚本进行递规分析,找出所有Python脚本执行所需的模块和DLL库,然后复制一份统一放到dist目录下。

关于跨平台:不同操作系统可执行文件的格式是不一样的、动态库也是不一样的,所以PyInstaller虽然支持Windows/Linux/Mac但显然不能一处打包到处运行,只能要生成哪个平台的可执行文件就要在哪个平台打包。

 

参考:

https://pypi.org/project/PyInstaller/

https://pyinstaller.readthedocs.io/en/v3.5/usage.html

我们今天的关于如何使Python脚本成为可执行程序python将脚本生成可执行文件的分享已经告一段落,感谢您的关注,如果您想了解更多关于IDA 配置python环境,可执行python脚本、Linux(CentOS)下把python脚本转化成可执行程序、PyInstaller打包Python源文件为可执行程序exe、PyInstaller把Python脚本打包成可执行程序教程的相关信息,请在本站查询。

本文标签:

上一篇字符串类compareTo()方法返回什么(字符串的返回值类型)

下一篇JasperReports API:调用JasperCompileManager.compileReport(String)方法引发了MalformedByteSequenceException异常