【发布时间】:2015-05-29 11:35:34
【问题描述】:
我有一个 Python 脚本,可以在我的开发 PC 上完美运行。两者都是具有相同 Python 版本 (2.7.9) 的 Windows 7。但是在目标机器上我得到了一个
ValueError: 不能这么早格式化日期
The error 似乎来自 pywin32 模块。
代码使用了pywin32调用的第三方库:
raw = win32com.client.Dispatch("MyLib.MyClass")
然后失败:
acq_time = raw.GetCreationDate()
现在我不知道为什么这可以在我的 PC 上而不是在目标机器上运行。两者都有 Windows 7 的“企业安装”,例如,相同的区域和日期时间设置。
有什么问题?我该如何解决?
编辑:
见 cmets。原因可能是使用了哪个C++ 运行时。我还在调查。我现在怀疑在安装 pywin32 时存在哪些运行时很重要。为什么?因为我的开发 PC 上的 DependenyWalker 说 pywin 在我的 Lotus Notes 安装中依赖于 MSVCR90.DLL。这告诉我它肯定不是“硬”链接。
2015 年 6 月 30 日更新:
我错了...这个问题现在也发生在我的电脑上。
一些进一步的信息。该脚本读取数据文件并插入读取的 元数据到数据库。只有较旧的文件似乎受到影响 错误,而不是新错误(我现在认为这是错误的假设)。所以我的想法是在我的 Dev PC 上进行初始加载,然后希望新文件不会再出现这个问题。
如果脚本将在 PC 上运行,它读取的文件位于 Windows 共享驱动器(映射网络驱动器)。我无权访问 驱动器,所以我只是将文件复制到我的电脑中。现在做初始 加载我请求访问所述网络驱动器和 BOOM。它也不 我的开发人员的工作。从共享驱动器读取时的机器。
问题并不总是发生在同一个文件上。我现在认为它与特定文件无关。我还在带有 64 位 python 的 64 位 PC 上进行了尝试。在那里花了更长的时间才发生错误。事实上,一个文件已成功读取,但在我的 PC 上失败了。我现在认为这是某种内存问题?我相信它总是在日期行上失败,因为所有其他行只返回 null 或空字符串,这不会导致任何问题,并且完全有可能这样的值可以为 null。但是对于日期来说是有问题的,不应该为空,然后抛出错误。
更新编辑:
在我的电脑上,它总是在同一个文件上失败。单独加载该文件可以正常工作。我现在认为这是在读取 n 个文件后出现的某种计数器/数字溢出问题。它与我每次运行脚本时加载的文件数量有关,而不是与文件本身有关。单独加载失败的文件。
【问题讨论】:
-
两台机器上的
pywin32版本相同?相同版本的库? -
马克哈蒙德的链接评论说
_tcsftime tries to be "helpful" by dieing with a too early date in some CRT implementations (eg, vs2008 64bit - and probably others)。你用的是什么 CRT? -
Windows 区域设置,尤其是日期格式如何?
-
@DougR 导致错误的 PC 没有版本(最新的,2.19)。但是我卸载了它并安装了与我的开发 PC 相同的版本,即 2.18。错误仍然存在(在提问之前是否这样做了)。
-
只是一个猜测,但鉴于您的最新编辑,您是否遇到了 Windows C 运行时 file limit 并且因为您的 COM 对象中的其他内容需要访问新文件而死亡?