Python脚本在IDLE中运行时可以看到Y:/驱动器,但在命令行中不能看到。

3
我有一个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 而不是整个路径,是因为它尝试到无法再返回为止使每个文件夹后退,这就是异常被抛出的时候)

命令行窗口的环境变量是否在某种程度上影响了驱动器映射,这应该指向脚本正确的位置吗?


1
你有没有注意到文件名中混合了 / 和 \ ? - Klaus D.
混合使用 / 和 \ 是正确的,但如果代码有可能在 Linux 上运行,建议使用 /。如果不这样做,在你把代码带到 *NIX 的那一天,会出现混乱。问题出在 * 上。 - bconstanzo
是的,我做了。目前我在字面上声明基本路径(因为这只是测试),然后使用os.path.join来创建其他文件夹,所以join方法是将'\'放入其中的。 - SuperBiasedMan
我能够复制您的错误消息的唯一方法是尝试打开不存在的文件夹,但您说您已检查了路径并以管理员身份运行。还有什么需要知道的吗? - bconstanzo
可能有,但我想我也不知道。我添加了一个检查目录是否存在的功能,并且命令行显示它不存在,但IDLE脚本仍然可以正常运行。我会和我们的IT人员谈谈,也许服务器周围还有更不寻常的权限问题我不知道。 - SuperBiasedMan
小更新,当我在另一台机器上运行时(虽然还不是我要访问的那台机器),它可以正常运行。这与我的设置有关,无论是 Python 还是命令行,我仍然不知道。 - SuperBiasedMan
2个回答

3
问题可能是因为IDLE和您的命令行以不同的特权级别运行。映射的网络驱动器并不自动对所有用户上下文可用。这里有一个超级用户关于这个问题的链接,还有很多其他资源也涵盖了这个主题。简而言之,映射的网络驱动器只对在建立映射时的特权级别下运行的程序可用。
如果您通过Windows UI映射了网络驱动器,则它将被映射到未提升的程序。但是,如果使用net use进行映射,则取决于映射创建时命令提示符的特权级别!
禁用UAC也会影响此行为,并且使用提升(或非提升)的命令提示符也会影响,这可能解释了为什么某些PC显示不同的行为。

谢谢你的回复,我会进一步调查。你认为有没有可能通过编程的方式来解决这个问题?如果能在脚本内部解决会更方便,但我也知道这可能是不切实际的希望。 - SuperBiasedMan
@SuperBiasedMan 这个问题解决了吗?你可以通过编程的方式映射网络驱动器。查看这个问题的众多答案。 - three_pineapples
在我能够在服务器上做任何事情之前,我必须与我们的IT人员交谈,所以我实际上还没有解决问题,但是我仍然会将您的答案标记为已接受,因为它解释了问题的来源,谢谢! - SuperBiasedMan

-1

我认为你的问题在于你试图打开*文件,当然这个文件不存在。open(path)接受path作为一个字面字符串,并不会对其进行任何翻译,因此它期望该值是一个有效的文件名。你应该改变你的代码,获取一个目录而不是一个文件,然后遍历该目录。


我实际上并没有指定它作为一个文件,而是在循环中使用os.listdir函数,像这样:for foldername in os.listdir(folders): - SuperBiasedMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接