【问题标题】:Python location of script if run as .exe from different place on Windows如果从 Windows 上的不同位置作为 .exe 运行,脚本的 Python 位置
【发布时间】:2021-03-29 16:07:05
【问题描述】:

我有一个 python 脚本:

C:\ProgramFiles\myscript.py

并使用 pyinstaller 创建了它的 .exe 版本:

C:\ProgramFiles\myscript.exe

我已确保 C:\ProgramFiles 在我的环境 Windows 路径中,以便我可以从任何位置从命令提示符运行脚本。

现在,问题是,我希望脚本知道它的位置。我尝试了一些可用的解决方案,例如:

sys.argv[0]

os.path.abspath(__file__)

但这些解决方案似乎仅在您使用 .py 脚本和 python 路径时才有效。一旦我切换到 .exe 并使用 Windows 环境路径,它就不再起作用了。所以当我从某个奇怪的地方运行程序时,比如:

C:\Users\John>myscript

它总是假设我运行命令的位置是它所在的位置,没有一个解决方案会给我我想要的结果 - 这将是原始位置:

C:\ProgramFiles\

基本上我想要实现的目标 - 我运行一个命令提示符并在其中运行一个 .exe 程序(最初是一个 .py 脚本)。然后windows搜索它的路径变量,看看它是否可以在某个可见的地方找到程序。如果窗口确实找到它,那么它将被执行。而且我希望程序知道 windows 实际在哪里找到它,而不是当前工作目录是什么。

【问题讨论】:

  • 可能是os.path.cwd()?这个函数具体在哪里我不记得了,但是应该在os
  • 检查文档 - runtime information 部分,尤其是 this part,其中包含用于清除哪个目录的示例脚本。

标签: python windows path exe


【解决方案1】:

您需要执行以下操作才能知道运行脚本的文件夹:

import sys, os
if getattr(sys, 'frozen', False):
    # we are running in a bundle
    bundle_dir = sys._MEIPASS
else:
    # we are running in a normal Python environment
    bundle_dir = os.path.dirname(os.path.abspath(__file__))

print(bundle_dir)

bundle_dir 是执行脚本的文件夹。这样,您的代码将在作为 python 脚本或转换为 exe 后运行。

正如我在评论中已经提到的,请查看 PyInstaller 文档中的 Run-time Information 部分。

【讨论】:

  • 感谢您的建议,在阅读您指导我的信息后,我尝试的第一件事是使用 sys.executable,它按我想要的方式工作 - 它给了我原来的位置。
  • 注意,当以.py 运行时,脚本sys.executable 将返回python 解释器的路径。我怀疑那是你想要的。我展示的方式保证无论是作为脚本运行还是转换为 exe 后,相同的代码都可以工作。
  • 尝试了bundle_dir,但它似乎工作不一样,因为它导致以下输出C:\Users\John\Appdata\Local\Temp\_MEI98882
  • 捆绑时它们的工作方式相同。如果您运行 python 脚本,它们会有所不同。如果你使用sysexecutable`,而不是捆绑在exe中,你会得到python解释器的路径。
  • 是的,sys.executable 当您以 .py 运行时指向 python 解释器,但问题的重点在于您以 .exe 运行它的场景。对于 .py 方法,sys.argv[0]os.path.abspath(__file__) 的解决方案工作得很好。非常感谢您为我指明了正确的方向。
【解决方案2】:

经过一些测试(感谢buran 的指导),我最终使用了这个解决方案:

import sys
import os

if getattr(sys, 'frozen', False):
    script_location = sys.executable
else:
    script_location = os.path.abspath(__file__)
script_location = os.path.dirname(script_location) 

目前似乎对 pyinstaller 构建的程序的 .py 版本和 .exe 版本都有效。

sys._MEIPASS

给了我位置

Appdata\Local\Temp 

这不是我想要的。

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多