Как передать имена файлов внешним командам, выполняемым из Python?

1

Я пытаюсь выполнить команду внутри скрипта 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 ошибок package org.htmlcleaner does not exist.

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

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

  • 0
    Попробуйте аргумент env для Popen с ключом PATH установленным на путь ваших пакетов Java.
  • 0
    srry .... можешь показать мне пример
Теги:

3 ответа

1
Лучший ответ

Ошибка не вызвана python, а подпроцессом 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'})
  • 0
    я попытался с помощью env={'CLASSPATH':'C:\\jdk1.6.0_23\\bin'} но теперь я получаю сообщение об ошибке, javac not recognized as internal program ...
  • 1
    Почему вы используете необработанную строку и удваивает обратную косую черту?
Показать ещё 1 комментарий
1

Пытаться

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.

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

  • 1
    Я думаю, что это должно быть CLASSPATH .
  • 0
    Имеет смысл. Я перефразировал и добавил это.
0

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

Таким образом, вы можете захотеть сделать:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню