我正在尝试将一个文件夹移动到另一个文件夹,但是当我尝试在Python脚本中执行此操作时却遇到权限被拒绝的错误,而在bash或什至在Python交互模式下运行该举动时,move成功运行。 / p>
cmd = ['sudo', 'mv', '/path1/dir', '/path2']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
if p.returncode != 0:
print(stderr)
我还尝试添加shell = True。
p = subprocess.Popen(' '.join(cmd), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
if p.returncode != 0:
print(stderr)
在两种情况下,我都会收到以下错误:
"mv: cannot move '/path1/dir' to '/path2/dir': Permission denied\n"
我以以下方式调用脚本:
sudo python script.py
我尝试在Shell和Python交互模式下执行每个命令,但没有收到任何错误。知道这里发生了什么吗?
答案 0 :(得分:0)
在浪费了数小时的时间进行故障诊断之后,我终于弄清了正在发生的事情。我正在使用tempfile创建/path1
和/path2
。这是代码段:
class UtilitiesTest(unittest.TestCase):
@staticmethod
def createTestFiles():
dir = tempfile.mkdtemp()
_, file = tempfile.mkstemp(dir=dir)
return dir, file
def test_MoveFileToAnotherLocation(self):
src_dir, src_file = UtilitiesTest.createTestFiles()
dest_dir, dest_file = UtilitiesTest.createTestFiles()
cmd = ['sudo', 'mv', src_dir, dest_dir]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
if p.returncode != 0:
print(stderr)
就像zwer在评论中说的那样,如果我使用sudo运行此脚本,则无需在我的mv命令中添加sudo。因为我一直在获得权限被拒绝的错误,所以我一直以为sudo可以解决我的问题。此处的实际问题是调用tempfile.mkstemp()时,它返回 open 文件描述符以及文件路径。我对第一个参数的关注不是很多,因此当我将我的createTestFiles()修改为以下内容时,一切都开始起作用。
@staticmethod
def createTestFiles():
dir = tempfile.mkdtemp()
fd, file = tempfile.mkstemp(dir=dir)
os.close(fd)
return dir, file