通过subprocess.Popen执行命令时出现权限被拒绝错误,但不是在Shell中

时间:2018-10-02 07:57:10

标签: python subprocess sudo mv

我正在尝试将一个文件夹移动到另一个文件夹,但是当我尝试在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交互模式下执行每个命令,但没有收到任何错误。知道这里发生了什么吗?

1 个答案:

答案 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