【问题标题】:Subprocess.call() from external drive来自外部驱动器的 Subprocess.call()
【发布时间】: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


【解决方案1】:

将列表传递给subprocess.call 会覆盖shell 标记化规则。您应该将字符串传递给 call 函数。

subprocess.call(callThis,shell=True)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2020-12-10
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多