【问题标题】:Python Script can see the Y:/ Drive when run from IDLE but not the command linePython 脚本从 IDLE 运行时可以看到 Y:/ 驱动器,但不能在命令行运行
【发布时间】:2015-06-05 22:35:26
【问题描述】:

我有一个 python 脚本,它通过搜索文件夹并拉入文件列表来构建文件。当我在 IDLE 中打开并运行它时,该文件运行良好并且按预期工作,但如果我在命令行窗口中运行脚本时,我会收到此错误:

C:\Windows\system32>python "C:\Users\ntreanor\Documents\RV Scripts\Server RV Sequence.py"
Traceback (most recent call last):
  File "C:\Users\ntreanor\Documents\RV Scripts\Server RV Sequence.py", line 69,
in <module>
    for foldername in os.listdir(pngFolders):
WindowsError: [Error 3] The system cannot find the path specified:
    'Y:/20_temp_script_testing/pr126 movs\\04_comp_pngs/*.*'

如果不明显,是的,路径确实存在。它不仅在 IDLE 中有效,而且我仔细检查过,路径确实存在。

我还尝试使用作为守护程序运行的脚本创建文件夹并得到类似的结果

Traceback (most recent call last):
  File "D:\shotgun\shotgunEventDaemon.py", line 888, in process
    self._callback(self._shotgun, self._logger, event, self._args)
  File "D:\shotgun\plugins\CreateAssetFolders.py", line 72, in createAssetFolders
    os.makedirs(folder)
  File "D:\Python27\Lib\os.py", line 150, in makedirs
    makedirs(head, mode)
  File "D:\Python27\Lib\os.py", line 150, in makedirs
    makedirs(head, mode)
  File "D:\Python27\Lib\os.py", line 150, in makedirs
    makedirs(head, mode)
  File "D:\Python27\Lib\os.py", line 157, in makedirs
    mkdir(name, mode)
WindowsError: [Error 3] The system cannot find the path specified: 'Y:/'

这是脚本在此之前作为文件夹记录的内容:

Making folder:
Y:/07_design/04_environmental_elements\eec005-08_insect_ladybird_red_7_spots_wide

(它说 Y 而不是整个路径的原因是它试图使每个文件夹返回,直到它不能再返回,这就是引发异常的时候)

命令行窗口的环境变量是否会影响应该将脚本指向正确位置的驱动器映射?

【问题讨论】:

  • 你注意到你在文件名中混合了/和\吗?
  • / 和 \\ 的混合工作正常,如果代码在 Linux 上运行的可能性很小,建议使用 /。如果您不这样做,那么在您将代码带到 *NIX 的休息日,您就会变得一团糟。是 * 给他带来了麻烦。
  • 我做到了,是的。目前我正在逐字声明基本路径(因为这只是测试),然后使用 os.path.join 来创建其他文件夹,所以加入方法就是放在'\\'中。
  • 我可以复制您的错误消息的唯一方法是尝试打开一个不存在的文件夹,但您说您检查了路径并以管理员身份运行。还有什么要了解的吗?
  • 可能有,但我想我也不知道。我添加了一个检查目录是否存在并且它说它不在命令行上,但 IDLE 脚本仍然运行良好。我会和我们的 IT 人员谈谈,也许服务器周围还有更多我不知道的异常权限。

标签: python path server


【解决方案1】:

问题可能是因为 IDLE 和您的命令行以不同级别的权限运行。映射的网络驱动器并非自动可用于所有用户上下文。关于这个here 有一个超级用户问题,很多other 资源涵盖了这个主题。简而言之,映射的网络驱动器仅对在映射所在级别运行的程序可用。

如果您已经通过 windows UI 映射了网络驱动器,那么它将被映射到未提升的程序。但是,如果它是用net use 映射的,那么它取决于映射时命令提示符的级别!

禁用 UAC 也会影响更改此行为,使用提升(或不提升)命令提示符也会影响,这可以解释为什么某些 PC 显示不同的行为。

【讨论】:

  • 感谢您的回复,我会调查的。你认为有办法以编程方式做到这一点吗?如果可以在脚本中以某种方式解决它会更容易,但我意识到这可能是一个不合理的希望。
  • @SuperBiasedMan 这最终解决了您的问题吗?您当然可以以编程方式映射网络驱动器。查看this问题的许多答案。
  • 我必须先与我们的 IT 人员交谈,然后才能在服务器上执行任何操作,因此我还没有真正解决问题,但我仍会将您的问题标记为已接受,因为它解释了问题,谢谢!
【解决方案2】:

我认为您的问题是您试图打开 * 文件,该文件当然不存在。 open(path) 将路径作为文字字符串并且无论如何都不翻译它,因此它期望该值是有效的文件名。您应该更改代码以获取目录而不是文件,然后遍历该目录。

【讨论】:

  • 我实际上并没有将其指定为文件,而是将 os.listdir 函数用于循环,如下所示:for foldername in os.listdir(folders):
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2018-04-14
  • 2016-11-30
  • 1970-01-01
相关资源
最近更新 更多