Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 来自外部驱动器的Subprocess.call()_Python_Windows_Shell_Cmd_Subprocess - Fatal编程技术网

Python 来自外部驱动器的Subprocess.call()

Python 来自外部驱动器的Subprocess.call(),python,windows,shell,cmd,subprocess,Python,Windows,Shell,Cmd,Subprocess,我正在尝试从外部驱动器运行Python脚本。脚本运行正常,但当它到达第行subprocess.call(callThis,shell=True)时,我(从命令提示符)收到错误消息文件名、目录名或卷标语法不正确。当我在C驱动器上运行相同的脚本时,它工作正常并复制文件。Python安装在C驱动器上,如果需要的话,外部驱动器是microSD卡。Python版本是3.4,但它也需要在Python 2.7上工作 相关代码: paths = [os.path.join(dirpath, fname) for

我正在尝试从外部驱动器运行Python脚本。脚本运行正常,但当它到达第
行subprocess.call(callThis,shell=True)
时,我(从命令提示符)收到错误消息
文件名、目录名或卷标语法不正确
。当我在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)”但是也有同样的问题。

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

subprocess.call(callThis,shell=True)

尝试为您试图运行的复制命令提供绝对路径。绝对路径是什么?程序已经为复制命令提供了源文件和目标的绝对路径。什么是“类似于”确切地说是什么意思?它与您在那里展示的有什么不同?如果您有文件的绝对路径,那么运行命令的位置就无关紧要了。您在这里使用“shell”有什么原因吗?不这样做并直接执行
copy
会不会更简单?Windows有xcopy.exe和robocopy.exe(健壮副本),但是
copy
命令需要
shell=True
,这需要命令行字符串而不是args列表。@cat40我指的是copy命令的绝对路径。在linux中,您可以使用
which cp
命令,它将打印实际cp命令的路径,在大多数情况下是/bin/cpmm并且您正在windows文件系统的某个位置使用windows Live,您应该能够为它提供一个绝对路径。很高兴删除该列表解决了您的问题。