无法在Linux上用Linux打开具有完整路径名的文件

时间:2012-03-11 03:54:16

标签: python linux ubuntu python-2.7 os.system

我最近安装了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 个答案:

答案 0 :(得分: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]))

答案 1 :(得分:2)

你正在有效地运行一个shell命令,它会被你路径中的空格绊倒。这不是引用参数,而是更清晰:

import subprocess
subprocess.call([ "gnome-open", nameList[row] ] )

答案 2 :(得分:0)

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

os.system('gnome-open "%s"' % nameList[row])

答案 3 :(得分: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]])