【问题标题】:Create a personal share using Python in Windows在 Windows 中使用 Python 创建个人共享
【发布时间】:2012-08-22 09:11:35
【问题描述】:

我正在尝试使用在 Python 上运行的 IDM 系统自动创建个人文件夹。所有用户共享都将在\\\server\personal\%userID% 上创建。 \\\server\personal and %userID% 作为 default_settings.home_directory 和 profileid 传递。我正在尝试这样的代码:

share = self.config.getID('default_settings.home_directory') +  profileid
self.log.info('Share = [{0}]'.format(share))
os.makedirs(share)

在我的日志中

Share = [\\server\personal\xr2829] 

但它会因

而出错
WindowsError: [Error 123] The filename, directory name, or volume label syntax is  incorrect: '\\\\'

【问题讨论】:

  • 日志中的 '...\xr2829' 看起来很可疑,就像一个无效的字符串文字十六进制转义序列,应该是 '\xhh' 的形式,其中 'h's 必须是十六进制数字 [0. .9][a..f]。反斜杠是从哪里来的?
  • “profileid”是随机生成的用户 ID。那是在开始时创建的,然后我只使用变量。
  • 反斜杠也让我感到困惑。 IDM 表示身份管理系统。
  • 您是否将实际代码复制并粘贴到问题中?错误消息表明它没有收到日志记录的相同字符串。
  • 反斜杠字符本身必须在 Python 字符串文字中转义(加倍),否则它们将被解释为转义序列的开头。检查生成随机配置文件 ID 的代码,因为这就是 '\xr2829' 中反斜杠的来源。

标签: python windows share cifs


【解决方案1】:

我猜你的配置字符串中// 后面有一个空字符。 Python 不在乎,但支持 os.makedirs 的 C 函数将在 null 处停止。尝试记录repr(share),这将提供更详细的字符串表示。

编辑:更仔细地查看os.makedirs 函数表明了另一种可能性。路径被分解为组件,以便可以根据需要检查或创建每个组件。该错误消息暗示前两个斜杠(使用repr 显示时的\\\\)已被分解为第一个目录元素。 documentation 表示从 2.3 版开始支持 UNC 路径,但可能您使用的是非常旧的 Python 版本,或者仍然存在错误。

【讨论】:

  • 当我使用repr(share) 时,我在日志中看不到任何内容。我错过了什么吗?
    使用self.log.info(repr(share)) 更新我能够在日志INFO - '\\\\corpfilesrv\\personal$\\xr2829' 中看到这一点
  • @user1628698 这破坏了我的理论。该字符串中没有空值,它将显示为\x00
  • 我使用的是 2.7 版,但它仍然可能是一个错误。
  • @user1628698:有趣的是,在personal 之后的日志中没有$,直到你在上面使用了repr()——也许这是一个线索。
  • 这个问题越来越奇怪了。该代码在物理服务器共享上创建文件夹时有效。我们的个人文件夹位于 CIFS 上,我仅在 CIFS 上收到错误 123。 CIFS 有什么不同吗??
【解决方案2】:

试试这个替代方案:

os.makedirs(os.path.join(self.config.getID('default_settings.home_directory'), profileid))

应该注意斜杠/反斜杠的混淆

【讨论】:

  • os.pathos 模块的子模块的名称,而不是其中的函数名称。无论如何,这对我来说看起来不像是斜杠/反斜杠问题。
  • 很好,我编辑了我的解决方案,以防万一这是一个斜线问题:-)
  • 我试了一下这段代码,收到了和以前一样的错误。
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
相关资源
最近更新 更多