Python = 3.6.8 System = Ubuntu问题:我想使用子流程进行复制,但无法正常工作。我首先使用Shutil模块,它可以正常工作,然后与子流程模块一起工作,则没有。有人可以向我解释我在做什么错吗?谢谢
>>> s
'/home/godzilla/Desktop/SoX/Install files for Windows/SoxFiles/libmad.dll'
>>> os.getcwd()
'/home/godzilla/Desktop/SoX/Install files for Windows'
>>> dest=os.getcwd()
>>> shutil.copy(s,dest)
'/home/godzilla/Desktop/SoX/Install files for Windows/libmad.dll'
>>> subprocess.call('cp {} {}'.format(s,dest))
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
subprocess.call('cp {} {}'.format(s,dest))
File "/usr/lib/python3.6/subprocess.py", line 287, in call
with Popen(*popenargs, **kwargs) as p:
File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'cp /home/godzilla/Desktop/SoX/Install files for Windows/SoxFiles/libmad.dll /home/godzilla/Desktop/SoX/Install files for Windows': 'cp /home/godzilla/Desktop/SoX/Install files for Windows/SoxFiles/libmad.dll /home/godzilla/Desktop/SoX/Install files for Windows'''
然后,如果我这样做
>>> subprocess.call('cp {} {}'.format(s,dest),shell=True)
1
我从上面得到一个1作为返回值,并且没有文件被复制。到目前为止,我只能使用shudir复制。为什么会发生这种情况?...我是否必须随机尝试10个命令才能复制一个文件? ....我一定在做明显的错误。
将您的参数作为列表分割并像run()
一样传递给subprocess.run(['cp',src,dst])
您可以在子过程模块的documentation上阅读更多内容
args应该是程序参数的序列,或者是单个字符串或类似路径的对象。默认情况下,如果args是序列,则要执行的程序是args中的第一项。如果args是字符串,则解释取决于平台,并在下面进行描述。有关默认行为的其他区别,请参见shell和可执行参数。除非另有说明,否则[[建议按顺序传递args
FileNotFoundError: [Errno 2] No such file or directory: 'cp /home/godzilla/Desktop/SoX/Install files for Windows/SoxFiles/libmad.dll /home/godzilla/Desktop/SoX/Install files for Windows': 'cp /home/godzilla/Desktop/SoX/Install files for Windows/SoxFiles/libmad.dll /home/godzilla/Desktop/SoX/Install files for Windows'''
我对{} {}语法不熟悉,但是看起来它正在引入变量s:
'/home/godzilla/Desktop/SoX/Install files for Windows/SoxFiles/libmad.dll'
并且空格和字符串文字的某些组合存在一些问题。这导致您要作为shell命令执行的内容被解释为仅一个巨型字符串。签出this以解决类似问题。