0

我最近安装了 Ubuntu 以与我的 Windows 操作系统一起运行。我想看看某个脚本是如何在 Ubuntu 中运行的,并且大部分情况下运行良好。我的代码中有这一部分会引起麻烦。我尝试使用 os.system('gnome-open ' + filePath) 命令打开文件,但我无法打开文件,除非我只指定文件名而不是目录(即我必须说“数据.txt”,我不能说“home/user/workspace/project/src/data.txt”,因为它会说文件/目录不存在)。此外,我出于测试目的制作了该文件的多个副本,其中一些在其名称中带有括号,当我尝试打开这些文件时,我收到错误“sh:语法错误:”(“意外”并且它没有指定代码行,所以我假设它是' 当我调用这个函数时访问。下面是我引用的代码。

def openFileOfItem(self, row):
        print fileList[row]
        if platform.system() == "Windows":
            os.startfile(fileList[row])
        else:
            if platform.system() == "Linux":
                os.system('gnome-open ' + nameList[row])
            else:
                os.system('open %s' % fileList[row])

还有一些示例输出:

/home/damian/workspace/Kde Gen/src/data.txt
Error showing url: Error stating file '/home/damian/workspace/Kde': No such file or directory
/home/damian/workspace/Kde Gen/src/data (copy).txt
sh: Syntax error: "(" unexpected
4

4 回答 4

3

您将字符串直接转储到命令行而不转义 - 当 shell 尝试执行您提供给它的命令时,这会导致错误。您需要先转义文件路径。由于您使用的是 Python 2.7,请尝试使用pipes.quote

from pipes import quote

def openFileOfItem(self, row):
    print fileList[row]
    if platform.system() == "Windows":
        os.startfile(fileList[row])
    else:
        if platform.system() == "Linux":
            os.system('gnome-open %s' % quote(nameList[row]))
        else:
            os.system('open %s' % quote(fileList[row]))
于 2012-03-11T04:02:20.527 回答
2

您正在有效地运行一个 shell 命令,并且它被路径中的空格绊倒了。与其引用论点,不如这样做更简洁:

import subprocess
subprocess.call([ "gnome-open", nameList[row] ] )
于 2012-03-11T11:15:32.637 回答
0

我不能说“home/user/workspace/project/src/data.txt”,因为它会说文件/目录不存在)

您的意思是 "/home/user/workspace/project/src/data.txt" 吗?否则,它是相对于当前目录的。

除此之外,在 UNIX 上,习惯上使用直接运行程序并传递参数向量的版本,否则 shell(由 system() 使用)可能会做一些奇怪的事情,你告诉它而不打算这样做(这就是所谓的注入) .

os.spawnvp(os.P_WAIT, "gnome-open", ["gnome-open", nameList[row]])

于 2012-03-11T09:21:54.673 回答
0

AFAICT,错误消息是因为路径中有空间。引用路径应该可以解决问题。

os.system('gnome-open "%s"' % nameList[row])
于 2012-03-11T04:00:16.650 回答