当前位置: 首页 > 知识库问答 >
问题:

PyInstaller 2.0包文件为--onefile

宋高寒
2023-03-14

我试图捆绑我的py脚本作为一个. exe使用PyInstaller 2.0。我可以捆绑脚本,但是在我的脚本中,我需要打开一个应该捆绑在exe中的文件(所以它是可移植的)。我做这个有困难...

在我的生活中。是的,我有

filename = 'C:\path\to\my\file\doc.docx'
data = open(filename,'rb')

我使用PyInstaller 2.0,这在我的电脑上工作正常,但是如果我把exe转移到另一台电脑上,它就不能工作了...PyInstaller 2.0非常新,所以上面的文档很少,出版商的留档也相当“缺乏”

以下是出版商关于此事的信息:(我不认为他们的留档是最新的,因为一开始它说使用Configure.py,然后在其他文档中它说2.0中不再需要Configure.py)

在--onefile发行版中,数据文件被捆绑在可执行文件中,然后在运行时由C代码(它还能够重建目录树)提取到工作目录中。操作系统最好能找到工作目录。环境。因此,您可以通过以下方式访问这些文件:

os.path.join(os.environ["_MEIPASS2"], relativename))

这对我这个初学编程的人来说真的没什么意义。。

来自出版商的一份不同的文件说...

在--onefile发行版中,数据文件被捆绑在可执行文件中,然后在运行时通过C代码(它也能够重建目录树)提取到工作目录中。工作目录最好由sys找到。_MEIPASS。因此,您可以通过以下方式访问这些文件:

os.path.join(sys._MEIPASS, relativename))

我已经用操作系统做了很多实验。环境[“_MEIPASS2”]和python似乎不理解操作系统。环境[“_MEIPASS2”]。我把这个拿回来:

>>> print os.environ["_MEIPASS2"]

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    print os.environ["_MEIPASS2"]
  File "C:\Python27\lib\os.py", line 423, in __getitem__
    return self.data[key.upper()]
KeyError: '_MEIPASS2'

我还用sys做了实验_梅帕斯。。是的,python响应“module”没有属性“\u MEIPASS”。

在这一点上,我觉得我的头快要爆炸了。。我感谢PyInstaller的作者们的工作,但他们的文档是我见过的最糟糕的!我只需要有人帮我把文件打包到exe中。我真的很想使用PyInstaller 2.0,因为所有的。规范的东西让我对PyInstaller的早期版本感到困惑。

顺便说一句,我在Python2.7中使用Win8 64位。3.

请帮忙!

共有1个答案

秦宏盛
2023-03-14

天啊!这个PyInstaller真的让我有点困惑。如果我以前的帖子听起来有点“暴躁”,对不起...不管怎样,对于任何试图在--onefile PyInstaller包中包含文件的人来说,这对我来说是有效的:

在你的. py脚本中包含这个:

filename = 'myfilesname.type'
if hasattr(sys, '_MEIPASS'):
    # PyInstaller >= 1.6
    chdir(sys._MEIPASS)
    filename = join(sys._MEIPASS, filename)
elif '_MEIPASS2' in environ:
    # PyInstaller < 1.6 (tested on 1.5 only)
    chdir(environ['_MEIPASS2'])
    filename = join(environ['_MEIPASS2'], filename)
else:
    chdir(dirname(sys.argv[0]))
    filename = join(dirname(sys.argv[0]), filename)

归功于一个我不记得名字的人。。(对不起,时间晚了,我累坏了!)

然后,如果您在cmd中使用pyInster-2.0 dir,您可以运行

pyinstaller.py --onefile myscriptsname.py

这将在pyInster-2.0目录中创建一个myscriptsname.spec文件。它也会创建一个exe,但那是行不通的。稍后会更新。现在编辑. spec,并添加以下a.datas行(记住数据,而不是数据)。我在. spec文件中包含了一些额外的内容,仅供参考。

a = Analysis(['ServerTimeTest_nograph.py'],
             pathex=['c:\\Python27\\pyinstaller-2.0'],
             hiddenimports=[],
             hookspath=None)
a.datas += [('myfilesname.type','C:\\path\\to\\my\\file\\myfilesname.type','DATA')]
pyz = PYZ(a.pure)

现在回到cmd快跑

pyinstaller.py --onefile myscriptsname.spec

这将更新您的。exe在/dist目录中。

也许有更好的方法,或者更漂亮的方法,但这对我来说很有效!

 类似资料:
  • 每次我试图编译它来测试它不recongnise文件

  • 让我们重新回到示例 Git 版本库的对象数据库。 目前为止,可以看到有 11 个对象——4 个数据对象、3 个树对象、3 个提交对象和 1 个标签对象: $ find .git/objects -type f .git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # tree 2 .git/objects/1a/410efbd13591db0

  • 我见过类似的问题,但他们仍然没有意义,我的猿类大脑。 这里有一个例子。如果我在名为的头文件中声明了一个函数:并且在文件中声明了一个函数:。我在另一个文件(例如)中看到过这样的人,它只包含头,它只有声明(里面没有代码),而不包含带有代码的。但令我震惊的是,当他们调用中的函数时,它使用了中的代码并打印“hello”。怎么做?当我只包含了文件时,它如何打印在文件中添加的“hello”,而它只是一个声明,

  • 我正在编写一个小的Java库,其中包含我通常在大多数android应用程序中包含的相关代码。我决定将库导出为一个jar文件,然后将该文件放到我未来项目的libs文件夹中。 null 现在,当我在我的一个android应用程序中使用这个jar时,除了Doc部分之外,所有的一切都像预期的那样运行。当我悬停在我的库的类和方法上时,我看不到我编写的文档注释。 Q1:我是不是又少了一步? Q2:jar文件应

  • 包文件包含的信息对你的项目文档是很有用的,比如该项目的名称和版本号。当JSDoc生成的文档的时候,可以自动使用项目中package.json文件中的信息。例如,默认的模板在文档中显示项目的名称和版本号。 有两种方法可以将package.json文件中的信息合并到您的文档: 1.在你的JavaScript文件的源路径中,包含package.json文件的路径。JSDoc将使用在源路径中发现的第一个p

  • SSI 指令为用户提供在 Web 服务器处理之前将一个文件的内容插入到另一个文件的方法。ASP 只使用这一机制的 #include 指令。要在 .asp 文件中插入一个文件,使用下面的语法: <!--#include virtual | file ="filename"--> virtual 和 file 关键字指示用来包含该文件的路径的类型,filename 是您想包含的文件的路径和名称。 被包