Python 获取可执行文件的路径?

Python get path to executable file?

我是 Python 编程的新手,我拼凑了一些代码,希望可以自动重命名特定文件夹中的一堆文件。我需要在没有安装 Python 的计算机上 运行 这个程序(它没有连接到互联网,我无法在上面安装 python)所以我转换了 .py 文件使用 auto-py-to-exe 到 .exe 文件。 .py 文件在我的笔记本电脑上运行,所以只有当我尝试 运行 .exe 文件时才会出现问题。

我在整个代码中使用脚本所在的文件夹的路径,因此在脚本的开头,我将文件路径保存为“路径”:

path = os.path.dirname(os.path.realpath(__file__))

但是,当我将 .py 文件转换为 .exe 文件并将该 .exe 文件移动到另一个文件夹时,保存在 'path' 变量中的文件路径位于临时文件夹中(可能是文件转换器的输出位置)。我通过隔离获取文件路径的脚本部分并制作一个 .exe 文件来仅打印该文件路径来测试它。

有没有其他方法可以获得可执行文件的文件路径?我不想将文件路径硬编码到程序中,因为人们不断地重新组织文件夹那台电脑,我希望这个程序灵活。

如果上下文需要,这里是其余代码。谢谢,如果这是一个非常基本的问题,我很抱歉:)

#  This section of code imports the modules used below
import os
import tkinter as tk
from tkinter import simpledialog
from tkinter import messagebox

#  Setting global variables
path = os.path.dirname(os.path.realpath(__file__)) + "/"  # This sets the filepath to the current folder

#  Choosing the dough
dough_input = tk.Tk(className='Select dough')
dough_input.geometry('400x200')

# This is the code that creates the dough selection box. Any new types can be added here using the template below:
dough = tk.StringVar()
radiobutton_1 = tk.Radiobutton(dough_input, text='a', variable=dough, value="a", tristatevalue=0)
radiobutton_1.pack()
radiobutton_2 = tk.Radiobutton(dough_input, text='b', variable=dough, value="b", tristatevalue=0)
radiobutton_2.pack()
radiobutton_3 = tk.Radiobutton(dough_input, text='c', variable=dough, value="c", tristatevalue=0)
radiobutton_3.pack()
radiobutton_4 = tk.Radiobutton(dough_input, text='d', variable=dough, value="d", tristatevalue=0)
radiobutton_4.pack()


# This section of code saves the dough chosen and closes the pop-up window.
def submitfunction():
    global bread
    bread = dough.get()
    dough_input.destroy()


submit = tk.Button(dough_input, text='Submit', command=submitfunction)
submit.pack()

# This section of code triggers the pop-up window for the dough selection.
dough_input.mainloop()

#  Inputting the first number
root = tk.Tk()
root.withdraw()
user_inp = simpledialog.askinteger("Number Input", "Input first number:")
i = int(user_inp)

#  Defining the file rename function
def rename():
    global i  # use the variable  "i" defined above (The number that the user inputs)
    for filename in os.listdir(path):  # for each file in the folder specified above do the following
        if ".sur" in filename:
            my_dest = str(bread) + " " + str(i).zfill(4) + ".txt"  # sets the new filename
            my_source = path + filename  # Defines the old filepath to the file
            my_dest = path + my_dest  # Defines the new filepath to the file
            os.rename(my_source, my_dest)  # rename function
            i = i + 1  # advances the program down the list
    messagebox.showinfo("Success", "All files have been renamed successfully!")  # confirmation message!


# This function asks the user if the information they've input is correct. Once the user clicks "ok" the program runs
# the rename function.
def sanity_check():
    file_list = os.listdir(path)
    j = 0
    for g in file_list:
        if ".txt" in g:
            j += 1

    # This section of code does some calculations and creates a "sanity check" for the user. It takes the number that
    # the user inputted above and sets that as the first number "i". Then it counts the number of files that
    # meets the above criteria and sets that to the number of files. It uses that number of files to calculate the
    # last number in the list. It then concatenates all this information and asks the user to 
    # confirm. If the user presses "ok" then the program
    # proceeds with the rename. If the user presses cancel, the program aborts.

    first_num = i
    num_files = j
    length_files = int(num_files) - 1
    last_file = i + length_files
    last_num = last_file
    check = str(
        "There are " + str(num_files) + " files in this folder. The dough analyzed is " + str(
            dough) + ". The first "
                       "number is " + str(first_num).zfill(
            4) + " and the last number is " + str(
            last_num).zfill(4) + ". Is this correct?")

    # This is the section of code that asks the user to verify the numbers.
    confirmation = messagebox.askokcancel("Sanity Check!", check)
    if confirmation == False:
        messagebox.showerror("", "Program Cancelled")
    else:
        rename()


# This is the command that runs the program.
sanity_check()

我想,os.getcwd()sys.executable 就是您要找的。 使用这 2 个函数,您将知道您正在编写 运行 脚本的文件夹(从您启动它的位置),以及当前 python 可执行文件的路径(可能包含在 .exe 分发中, 并解压到 tmp 目录):

$> mkdir -p /tmp/x
$> cd /tmp/x
$> pwd
/tmp/x
$> which python
/usr/bin/python
$> python
Python 3.9.5 (default, May 24 2021, 12:50:35)
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/tmp/x'
>>> import sys
>>> sys.executable
'/usr/bin/python'
>>> 

这对我有用。

import sys, os
if getattr(sys, 'frozen', False):
        application_path = os.path.dirname(sys.executable)
elif __file__:
        application_path = os.path.dirname(__file__)

我也遇到过类似的情况,并且发现无论我是在生产中还是为了测试使用 .exe 文件或 .py 到 运行,上述逻辑都有效。