2013-10-10 6 views
0

У меня есть архив .jar, который загружает файл, а затем выполняет некоторые действия с ним и снова записывает его на диск.Ошибка разрешения при запуске jar из python

Если я вызываю этот .jar непосредственно из командной строки, все работает. Но когда я пытаюсь сделать это внутри питона, я получаю следующее сообщение об ошибке:

Input file ("C:\xxx.txt") was not found or was not readable. 

Это мой питон код:

import sys, os, subprocess 

if os.path.isdir(sys.argv[1]): 
    for file in os.listdir("."): 
     print (" ".join(['java', '-jar', sys.argv[2], 'd', "\"" + os.path.abspath(file) + "\"", "\""+os.path.join(os.path.join(os.path.abspath(os.path.dirname(file)), "output"), file) + "\""])) 

     subprocess.call(['java', '-jar', sys.argv[2], 'd', "\"" + os.path.abspath(file) + "\"", "\""+os.path.join(os.path.join(os.path.abspath(os.path.dirname(file)), "output"), file) + "\""]) 

Когда я копирую печатное заявление в командной строке, то баночка выполняет в совершенстве; все работает. Я попробовал запустить cmd как администратор, но это не помогло.

+0

Как примечание, вы можете просто написать '' '' 'вместо' '\" "'. Это намного более читаемо. – abarnert

+0

Кроме того, вам не нужен 'os.path.join (os.path.join (foo, bar), baz)', просто 'os.path.join (foo, bar, baz)' будет делать то же самое , – abarnert

+0

Спасибо за советы. Это первый раз, когда я использую os.path. * – Dauntless

ответ

1

Проблема заключается в дополнительных кавычках, которые вы добавляете. Когда вы передаете subprocess список аргументов, он уже цитирует их соответствующим образом; если вы процитируете их сами, это приведет к цитированию ваших кавычек, поэтому вместо передачи аргумента, который при некорректном значении означает C:\xxx.txt, вы передадите аргумент, который при некорректном использовании означает "C:\xxx.txt", что не является допустимым именем пути ,

Правило большого пальца для Windows *: если вы точно знаете, что такое каждый аргумент, передайте их как список и не пытайтесь их процитировать; если вы точно знаете, какова должна быть последняя строка командной строки, передайте ее как строку и не пытайтесь самостоятельно ее разбить на список отдельных аргументов.


* Обратите внимание, что это только для Windows. В POSIX, если вы не используете shell=True, вы должны в основном никогда использовать строку.

+0

Спасибо. Сначала я получил это без кавычек, но тогда, конечно, мое печатное заявление не было запущено в cmd, поэтому я подумал, что это была моя ошибка. – Dauntless

+0

@Dauntless: Если вы хотите создать строки, которые вы можете запустить в cmd, вы можете; просто передайте ту же самую строку, которую вы напечатали, на 'call', вместо того, чтобы разбивать ее на список. – abarnert

Смежные вопросы