Не могу открыть файл с полным именем пути в Linux в Python - PullRequest
0 голосов
/ 11 марта 2012

Я недавно установил Ubuntu для работы вместе с моей ОС Windows. Я хотел посмотреть, как работает определенный скрипт в Ubuntu, и по большей части он работает нормально. Есть одна часть моего кода, которая вызывает проблемы. Я пытаюсь открыть файл с помощью команды os.system ('gnome-open' + filePath), но не могу открыть файл, если не укажу только имя файла, а не каталог (т.е. я должен сказать "данные" .txt ", я не могу сказать" home / user / workspace / project / src / data.txt ", потому что он скажет, что файл / каталог не существует). Также я сделал несколько копий этого файла для целей тестирования, и у некоторых из них есть скобки в их именах, когда я пытаюсь открыть эти файлы, я получаю ошибку «sh: Syntax error:» («неожиданный», и он не указывает строка кода, поэтому я предполагаю, что эта строка используется при вызове этой функции. Ниже приведен код, на который я ссылаюсь.

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 ]

3 голосов
/ 11 марта 2012

Вы выгружаете строку непосредственно в командную строку без экранирования - это приводит к ошибкам, когда оболочка пытается выполнить предоставленную ей команду.Сначала вам нужно уйти от пути к файлу.Поскольку вы используете 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]))
2 голосов
/ 11 марта 2012

Вы эффективно запускаете команду оболочки, и она запутывается пробелами на вашем пути.Вместо того, чтобы приводить аргументы, лучше сделать это:

import subprocess
subprocess.call([ "gnome-open", nameList[row] ] )
0 голосов
/ 11 марта 2012

Я не могу сказать "home / user / workspace / project / src / data.txt", потому что он скажет, что файл / каталог не существует)

Вы имели в виду "/home/user/workspace/project/src/data.txt"? В противном случае это относительно текущего каталога.

Кроме этого, в UNIX принято использовать версию, которая запускает программу напрямую и передает вектор аргумента, в противном случае оболочка (используемая system ()) может делать странные вещи, о которых вы сказали, не намереваясь (то есть называется инъекцией).

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

0 голосов
/ 11 марта 2012

AFAICT, сообщение об ошибке, потому что у вас есть место в пути.указание пути должно решить проблему.

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