我正在为Windows 7的Python应用程序开发Inno Setup安装程序,我有以下要求:
是否有推荐的处理方法?喜欢给用户一种(重新)生成.pyc文件的方法?或者,通常不值得担心的.pyc文件的启动时间较短?
答案 0 :(得分:0)
不保证PYC文件与不同的python版本兼容。如果您不知道所有客户都运行相同的python版本,那么您真的不想直接分发pyc。因此,您必须在分发PYC和支持多个python版本之间进行选择。
您可以使用py_compile创建编译所有文件的构建过程,并将其压缩到特定于版本的软件包中。您可以使用setuptools.执行此操作;但是这样做很麻烦,因为你必须在你需要支持的每个版本中运行py_compile。
如果您基本上分发一个已关闭的应用程序,并且不希望人们对您的源代码进行简单的访问,那么py2exe可能是一个更简单的选择。如果您的python应该集成到用户的python安装中,那么只需创建.py文件的zip并添加一行.py存根就可以更简单,该存根使用{{3}导入压缩包。 }
如果它让你感觉更好,PYC不提供额外的安全性,它也不能真正提高性能:)
答案 1 :(得分:0)
如果您还没有阅读PEP 3147,那么可能会回答您的问题。
我不是指那个PEP中描述的解决方案,并且是从Python 3.2开始实现的。如果您的“多个Python版本”仅仅意味着“3.2,3.3,可能还有将来的3.x”,那就太棒了。或者即使它意味着“2.6+和3.1+,但我只关心3.2和3.3,所以如果我没有得到pyc加速其他那些没关系”。
但是当我问你支持的版本时,你说“2.7”,这意味着你不能依靠PEP 3147来解决你的问题。
幸运的是,PEP充满了对早期解决问题的尝试以及每个问题的陷阱的讨论,并且应该有足够的数据来确定选项是什么以及如何实现它们。
一个问题是PEP非常以Linux为中心 - 主要是因为它主要是试图在过去解决问题的Linux发行版。 (Apple也这样做了,但是他们的解决方案是(a)非常有用,并且(b)与整个Mac特定的“框架”事物紧密结合,所以他们大多被忽略了......)
因此,它基本上留下了“我应该把.pyc文件放在Windows上的哪个位置?”的问题。
最佳选择可能是用户本地应用程序数据目录下的特定于应用程序的目录。如果您可以要求Vista或更高版本,请参阅Known Folders,如果不能,请CSIDL。无论哪种方式,您都在寻找FOLDERID_LocalAppData或CSIDL_LOCAL_APPDATA,它是:
文件系统目录,用作本地(非漫游)应用程序的数据存储库。典型路径为
C:\Documents and Settings\username\Local Settings\Application Data
。
关键在于它是一个应用程序存储数据的地方,这些数据对于每个用户(以及该用户的配置文件目录中)是独立的,并且对于每台机器,用户的漫游配置文件可能最终都会被打开,这意味着您可以安全地放置东西在那里,并且知道用户有权在没有UAC参与的情况下写入那里,并且知道(以及你曾经做过)没有其他用户或机器会干扰那里有什么。
在该目录中,您可以为程序创建一个目录,并在其中放置您想要的任何内容,只要您选择了一个唯一的名称(例如My Unique App Name
或My Company Name\My App Name
或UUID),你可以避免与其他程序意外碰撞。 (MSDN上曾经有过这方面的具体指导原则,但我再也找不到了。)
那么,你怎么到达那个目录?
最简单的方法是使用env变量%LOCALAPPDATA%
。如果您需要处理较旧的Windows,可以使用%USERPROFILE%
并将\Local Settings\Application Data
添加到最后,保证两者相同,或者通过联结在同一个地方结束。
您还可以使用pywin32
或ctypes
来访问本机Windows API(因为至少有3种不同的API,至少有两种方法可以访问这些API,我不想要给所有可能的方法来写这个...但是快速google或SO搜索“pywin32 SHGetFolderPath”或“ctypes SHGetKnownFolderPath”或任何应该给你你需要的东西。
或者,有多个第三方模块可以处理这个问题。 Google和PyPI中的第一个出现了winshell
。
答案 2 :(得分:0)
重新阅读原始问题,有一个更简单的答案,可能符合您的要求。
我对Inno了解不多,但是大多数安装程序都会为您提供一种在复制后步骤中运行任意命令的方法。
因此,您可以在安装时使用python -m compileall
为您创建.pyc
文件,同时您仍然拥有提升权限,因此UAC没有问题。
事实上,如果你看一下pywin32
以及作为安装程序包提供的各种其他Python软件包,他们就是这样做的。这是将库安装到用户的Python安装中的惯用方法,因此我不明白为什么安装使用用户Python安装的可执行文件不合理。
当然,如果用户以后决定卸载Python 2.6并安装2.7,那么你的.pyc
文件将被清除......但是根据你的描述,听起来你的整个程序都会被冲洗掉,并推荐使用用户可能会卸载并重新安装,对吗?