目录
1.通过Python中的sys.argv在程序中获取输入文件的路径
前言
平常编写python程序时,我们往往在集成IDE中编写代码并进行调试。但是如何生成python源代码的可执行文件呢?更进一步,我们如何能做到像其他的标准软件那样,能够利用自己编写的程序对应的可执行文件来打开指定类型的文件(如txt,obj等等)呢?
举个例子,假如有一个文件叫做some.py,因为它是.py文件,它可以直接通过点击文件的方式运行。这一过程的本质其实是将该文件作为参数交由python.exe进行运行。
那么,我们自己编写的程序如何做到这一点?我们编写的程序如何关联到指定的文件,作为这些文件的浏览器或是编辑器?接下来,笔者会通过构建一个实际应用 (一个简单的文本阅读器)来让读者们了解实现这一功能的方法。
1.通过Python中的sys.argv在程序中获取输入文件的路径
对于简介中描述的过程,我们用一个更加容易理解的方式来表达,下图是点击文件后并运行的结构流程图。
可以看到,文件本身的路径视为一种环境变量,会被作为参数传递给选择的可执行文件。
如果我们要编写一个文件阅读器或是编辑器,我们必须获取用户点击的文件的路径,否则我们的程序将无法找到应该处理的文件。
Python中的sys.argv是一个从程序外部获取参数的渠道,从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,可以用[0]、[1]、[2]、[3]…等提取其中的元素。第一个元素(sys.argv[0])是程序本身,随后才依次是外部给予的参数。用户在操作系统的图形界面点击的文件的路径将作为第二个参数传入程序,即sys.argv[1]。
通过下面的程序可以查看我们编写的程序从外界输入的参数。
import sys
print(sys.argv)
上面的语句能够打印python脚本运行时的输入参数,sys.argv为脚本启动时的输入参数列表,如果只是通过点击此脚本文件本身,那么它只是一个含有此脚本文件的文件路径的一个长度为1的列表。
我们编写一个非常简单的文本阅读器,它可以通过点击任意文件,在命令行中打印该文件内部的文本信息,代码如下:
import sys
import os
def print_file_text(file_path):
'''
打印文件文本
'''
new_file = open(file_path,encoding = "utf-8")
file_text = new_file.read()
print(file_text)
if __name__ == "__main__":
#获取参数列表
sys_args = sys.argv
print(sys_args)
if (len(sys_args)>1):
#如果通过点击其他文件的方式间接打开此程序,那么获取此文件的路径并作为输入参数
file_path = sys_args[1]
#打印输入文件的内容
print_file_text(file_path)
else:
#如果在操作系统中点击此文件本身,并运行此文件,那么此时sys.argv的列表长度为1,只包含此程序文件的路径
print("there is no file to read")
pass
os.system("pause");
此程序的文件名为execute_test.py,直接点击此文件并运行,会在命令行中看到如下的输出:
显然,由于此时是直接运行的方式,sys.argv中只含有一个参数,它便是程序文件的本身的路径。
2.将编写的python程序打包为可执行文件
这里我们需要用到pyinstaller包,window+R打开cmd,输入
pip install pyinstaller
即可下载pyinstaller包,它可以将我们编写的python源文件打包为.exe可执行文件。
下图为笔者存放源程序的文件夹结构:
打开存放我们源文件的文件夹,鼠标右键选择“在终端中打开”,输入指令
pyinstaller -F xxx.py
(xxx.py为想要打包的文件名,这里为execute_test.py)
此后,便会通过pyinstaller自动打包,完成后会在此目录下生成dist和build文件夹,dist中存放着生成的exe文件。
3.将文件的打开方式设置为自己的可执行程序
接下来我们新建一个名叫hello.txt的文件作为测试文件,它的内容为:
将hello.txt的打开方式设置为我们的execute_test.exe.
那么此时点击hello.txt,命令行中的输出如下:
这时,我们便能看到sys.argv含有两个参数,第二个即为用户点击的文件的路径。既然已经知道了文件的路径,读取文件并显示文本将不再是难题。红框中即为hello.txt文件中的文本内容。至此,我们的文件文本浏览器就实现了。
此案例虽然简单,但是它完整地展现了利用自己编写的python程序打开指定文件或是编辑指定文件的具体方法,希望能够对部分读者有所帮助。