编译Python写入程序文件

我写了一个程序,创build了几个sqlite3数据库临时文件。 在开发中,我只是将它们存储在与src包相同的文件夹中的一个文件夹中。 当代码被编译并从程序文件运行时,我忽略了你需要pipe理员权限的事实。 (我知道程序文件中的临时文件也是不好的做法)

问题是:没有问题。 我没有得到一个IOError: [Errno 13] Permission denied:或任何forms的警告。 此外,如果我去应该有临时文件的文件夹,没有任何。

如果我添加一行

 print os.path.exists(r'C:\Program Files (x86)\ProgramName\temp\filename.db') 

要么

 print os.listdir(r'C:\Program Files (x86)\ProgramName\temp') 

到我的程序,它显示文件在那里,但不存在于资源pipe理器,cmd或闲置。 但是,他们确实cygwin中出现。

我已经显示隐藏的文件/文件夹,他们不显示。

如果我使用资源pipe理器复制临时文件夹,文件不会一起标记。 如果我使用cygwin复制文件夹,他们可以。 他们也成为可见的探险家。

有没有其他人经历过这个或知道发生了什么?

你是对的,你不应该写入你的程序文件目录。 真的,这就是你的程序的解决方案:改变你的脚本停止这样做。

但是,如果您想知道文件的位置,当您尝试写入Program Files(在Vista或更高版本上,UAC未禁用)时:

  • 如果以管理员身份运行,而不是以XP / 2003或更早版本的模拟运行,则会直接将文件写入指定的路径。
  • 如果你的应用程序符合神奇的触发器看起来像一个安装程序(见这里的Vista文档),文件直接写入指定的路径。
  • 如果您的应用程序位于Microsoft的兼容性数据库中,则路径将通过兼容性数据库中的条目进行映射(似乎没有任何文档记录)。
  • 否则,你的路径通过UAC文件虚拟化传递,这意味着尝试写入受保护的目录(例如Program Files最终会在用户的应用程序数据目录下的某个地方 – 对于您的程序,它看起来像程序文件,但是对于Explorer或cmd .exe它不。

我相信这个位置不能保证也没有文档记录,并且一度从用户的应用程序数据目录移动到用户的不同特殊应用程序数据目录下的每个应用程序目录,但至少在一台Windows 7机器上这是:

C:\ Users \ horriblyUnpythonic \ AppData \ Local \ VirtualStore \ Program Files(x86)\ ProgramName \ temp \ filename.db


如果您搜索“UAC文件虚拟化”,那里有很多博客文章。 他们中的大多数都是从构建自定义安装程序的角度编写的,就像这个 (因为,你可以想象,这对定制安装程序来说是一个严重的问题),但是他们大多都是把想法付诸实践,详细信息,并添加链接进一步阅读。

如果你只遇到这个问题,从Vista迁移到7,或者从32位Vista迁移到64位Vista, 这个微博客是我见过的唯一一个深入细节的地方……除了图像和大部分这个讨论似乎已经消失了。