【发布时间】:2016-05-04 20:32:07
【问题描述】:
我正在尝试从外部驱动器运行 Python 脚本。该脚本运行良好,但是当它到达subprocess.call(callThis, shell=True) 行时,我收到错误(来自命令提示符)the filename, directory name, or volume label syntax is incorrect。当我从 C 驱动器运行相同的脚本时,它可以正常工作并复制文件。 Python 安装在 C 盘上,如果重要的话,外部驱动器是 microSD 卡。 Python 版本是 3.4,但它也需要在 Python 2.7 上工作。
相关代码:
paths = [os.path.join(dirpath, fname) for dirpath, __, fnames in os.walk('.\\MUSIC') for fname in fnames]
for path in paths:
pathcomp = path.replace('.\\MUSIC', 'C:\\redacted\\Music\\MUSIC')
if not os.path.isfile(pathcomp):
abspath = os.path.abspath(path)
callThis = 'copy "'+abspath+'" "'+os.path.dirname(pathcomp)+'"'
print(callThis)
subprocess.call([callThis], shell=True)
打印callThis 输出类似于
copy "G:\MUSIC\dir1\dir2\fname.mp3" "C:\redacted\Music\MUSIC\dir1\dir2\fname.mp3"
在命令提示符中键入该确切行可以正常工作并复制文件。
我认为问题与命令提示符用完 C 驱动器而不是外部驱动器有关。我怎样才能让它用完外部驱动器(在python脚本中显示G:/>而不是C:\?我尝试了`subprocess.call('G:',shell = True)但有同样的问题。
【问题讨论】:
-
尝试为您尝试运行的复制命令提供绝对路径。
-
什么的绝对路径?程序已经为复制命令提供了源文件和目标的绝对路径。
-
“类似的东西”到底是什么意思?它和你在那里展示的有什么不同?如果您有文件的绝对路径,那么运行命令的 where 并不重要。你在这里涉及“外壳”有什么原因吗?不这样做,直接执行
copy不是更简单吗? -
Windows 有 xcopy.exe 和 robocopy.exe(稳健复制),但
copy命令需要shell=True,它需要命令行字符串而不是 args 列表。 -
@cat40 我的意思是复制命令的绝对路径。在 linux 中,您可以使用命令
which cp,它会打印出实际 cp 命令的路径,在大多数情况下是 /bin/cp。您在 windows 中使用的复制命令位于 windows 文件系统中的某个位置,您应该能够为其提供绝对路径。很高兴删除列表解决了您的问题。
标签: python windows shell cmd subprocess