如何使用 Nuitka 从 Python 获取已编译二进制文件的当前路径?

Hot*_*hen 2 python nuitka

Nuitka 擅长将 Python 编译为可执行的二进制文件。\n但是编译后的二进制文件会从原始绝对路径中找到其他资源文件。\n因此,要移动到另一台计算机,需要制作目录树原始目录树相同

\n\n

例如,如果我编译一个这样的项目:

\n\n
/home/me/myproj/\n\xe2\x95\xa0\xe2\x95\x90 myprog.py\n\xe2\x95\x9a\xe2\x95\x90 resource\n   \xe2\x95\x9a\xe2\x95\x90 foo.data\n
Run Code Online (Sandbox Code Playgroud)\n\n

我应该将生成的二进制文件和资源放到另一台计算机的同一位置。\n如何解决此问题?

\n\n

我更简单的尖峰是:

\n\n
# /home/me/myproj/spike.py\nimport os\nprint(os.path.dirname(__file__))\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译后,移动到任何其他位置,我总是得到以下结果/home/me/myproj.

\n\n

我需要一个结果,就像/another/path我将编译myproj.bin/another/path.

\n

Sna*_*ing 5

尝试使用sys.argv[0]os.path.abspath而不是__file__

例如:

abs_pth = os.path.abspath(sys.argv[0])
your_dir = os.path.dirname(abs_pth)

for val in abs_pth,your_dir:
    print(val)
Run Code Online (Sandbox Code Playgroud)

这将帮助您获取可执行二进制文件的当前路径,以及使用位于同一文件夹中的目录。

https://nuitka.net/doc/user-manual.html#onefile-finding-files

sys.argv[0]onefile more 的主模块和主模块之间存在差异__file__,这是由于使用引导程序到临时位置而导致的。第一个路径是原始可执行路径,第二个路径是引导程序可执行文件解压到的临时或永久路径。数据文件将位于后面的位置,您的原始环境文件将位于前面的位置。

# This will find a file near your onefile.exe
open(os.path.join(os.path.dirname(sys.argv[0]), "user-provided-file.txt"))
# This will find a file inside your onefile.exe
open(os.path.join(os.path.dirname(__file__), "user-provided-file.txt"))
Run Code Online (Sandbox Code Playgroud)