Как передать имена файлов внешним командам, выполняемым из Python? - PullRequest
1 голос
/ 09 сентября 2011

Я пытаюсь выполнить команду внутри скрипта Python:

import subprocess
output_process = 
   subprocess.Popen("javac -cp C:\Users\MyUsername\Desktop\htmlcleaner-2.2.jar Scrapping_lastfm.java",
                    shell=True, stdout=subprocess.PIPE)

Но я получаю сообщение об ошибке package org.htmlcleaner does not exist.

Если я запускаю команду javac независимо, она выполняется нормально ..

Моя текущая рабочая директория C:\Users\MyUsername.

Ответы [ 3 ]

1 голос
/ 09 сентября 2011

Ошибка вызывается не питоном, а подпроцессом java.Скорее всего, Java-машина не находит некоторые библиотеки, и это устраняет проблему с проблемой конфигурации PATH, скорее всего, переменная CLASSPATH не была установлена ​​в среде.решить:

import shlex

JAVA_COMMAND=r"javac -cp C:\\Users\\MyUsername\\Desktop\\htmlcleaner-2.2.jar Scrapping_lastfm.java"

cmdline = shlex.split(JAVA_COMMAND)

output_process = subprocess.Popen(cmdline,shell=True, stdout=subprocess.PIPE, env={'CLASSPATH':'/path/to/java/packages'})
1 голос
/ 09 сентября 2011

Попробуйте

output_process = subprocess.Popen(["javac", "-cp", 
    "C:\Users\MyUsername\Desktop\htmlcleaner-2.2.jar", "Scrapping_lastfm.java"],
    shell=True, stdout=subprocess.PIPE, env={'ENVIRONMENTAL': '/variables/here'})

с любыми переменными среды, связанными с Java, которые вы используете, когда вы запускаете javac обычно как элементы в словаре env. asgs предполагает, что вам нужно CLASSPATH.

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

0 голосов
/ 09 сентября 2011

Помните, что вы должны экранировать обратную косую черту (\) в строке.С вашим примером все в порядке, однако если ваше имя пользователя на самом деле не MyUsername, а может быть «nerd» или любая другая строка, образующая допустимую escape-последовательность, команда завершится неудачно.Также убедитесь, что у вас нет пробелов в имени файла (или используйте синтаксис split в другом примере).

Так что вы можете сделать:

output_process = subprocess.Popen(["javac", "-cp", 
    "C:\\Users\\MyUsername\\Desktop\\htmlcleaner-2.2.jar", "Scrapping_lastfm.java"],
    shell=True, stdout=subprocess.PIPE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...