是否可以从 Python 可执行文件访问启动快捷方式目录?

Is it possible to access the launching shortcut directory from a Python executalbe?

我目前有一个 Python 脚本,它 运行 遍历当前目录中的所有 Excel 文件并生成 PDF 报告。

它现在工作正常,但我不希望用户在任何地方接近冻结 Python 脚本。我用 cxFreeze 创建了一个 MSI,它将 EXE 和脚本放在 Program Files 目录中。

我想做的是为这个可执行文件创建一个快捷方式,并将快捷方式 运行 来自的目录传递给 Python 程序,以便可以将其设置为工作目录。这将允许用户将快捷方式移动到 Excel 文件的任何文件夹并在那里生成报告。

是否 Windows 将打开的快捷方式的位置发送到可执行文件,有没有办法从 Python 访问它?

启动快捷方式时,Windows 将工作目录更改为快捷方式中指定的目录,在开始于 字段中。此时,Windows 不记得快捷方式的存储位置。

您可以更改 Start in 字段以指向快捷方式所在的目录。但是您必须对每个快捷方式都这样做,并且永远不要创建错误。

更好的方法是使用脚本,而不是快捷方式。将您的实际 Python 脚本(为了举例起见,我们称之为 doit.py)放在您的 PYTHONPATH 中的某处。然后创建一个导入它的 single-line Python 脚本:

import doit

保存它(但不要将其命名为 doit.py)并将其复制到您希望能够从中调用主脚本的每个目录。在 doit.py 中,您可以使用 os.getcwd() 找出调用您的目录。

您也可以使用批处理文件来完成。这更灵活一些,因为您可以指定脚本的确切名称以及应该使用哪个 Python 解释器,并且不需要将脚本存储在 PYTHONPATH 中的目录中。此外,您不必担心文件名与 Python 模块的名称冲突。只需将这一行放在一个文件中:

C:\path\to\your\python.exe C:\path\to\your\script.py

将其另存为(例如)doit.bat 并将其复制到要调用它的目录中。和以前一样,您的 Python 脚本可以调用 os.getcwd() 来获取目录。或者你可以这样写,让你的 Python 脚本接受它作为第一个参数,然后像这样写你的批处理文件:

C:\path\to\your\python.exe C:\path\to\your\script.py %cd%

您可以使用批处理文件方法做的另一件事是在末尾添加一个 pause 命令,以便在脚本运行后要求用户按下一个键,让他们有机会阅读任何输出由脚本生成。您甚至可以将此设置为有条件的,以便它仅在发生错误时发生(这需要从脚本返回正确的退出代码)。我会把它留作练习。 :-)

修改脚本以将目录作为命令行参数进行处理有问题吗?

然后您可以配置不同的快捷方式以传入适当的目录。

将以下内容键入批处理文件(即 script.bat):

python \absolute\path\to\your\script.py %~dp0
pause

然后将这些导入添加到 python 文件的顶部 script.py(如果尚未包含):

import os
import sys

并将此添加到 python 文件的底部(或将其与类似语句组合):

if __name__ == "__main__":
    # set current working directory:
    if len(sys.argv) > 1:
        os.chdir(sys.argv[1])

    main()

main() 替换为您要调用的任何函数或代码 运行。


以下是我得出答案的方式:

我尝试使用 并遇到了以下问题:

  • 将脚本存储在 PYTHONPATH 某处的第一个建议不适用于我的情况,因为我的脚本将在服务器上使用并且需要独立于客户端计算机的 python 环境(除了具有所需的 pip 安装)。

  • 我尝试从 Windows 批处理文件中调用我的 python 脚本,该批处理文件可以移动到其他位置。批处理文件的位置不是用作当前工作目录,而是 C:\Windows.

  • 我尝试将 %cd% 作为参数传递给我的 python 脚本,然后将其设置为我的 CWD。这仍然导致 C:\Windows.

    的 CWD

查看评论后,我尝试 而不是将 %~dp0 作为参数传递给 python 脚本。这导致 CWD 被正确设置为批处理文件的位置。

我希望这能帮助其他面临类似困难的人。