Python, os.system не работает, когда скрипт не находится в той же папке - PullRequest
2 голосов
/ 25 декабря 2011

У меня есть файл bat.bat, содержащий следующую команду: 'setup.py build'

У меня есть скрипт, который выполняет эту команду летучей мыши, используя:
os.system('E:/bla/FPtest/retryURL/Temp_installed/bat.bat'

Если я запускаю скрипт из той же папки, что и bat.bat ..., он отлично работает.

Если я запускаю его в ЛЮБОЙ другой папке, возвращается следующая ошибка.

**'setup.py'** is not recognized as an internal or external command, operable program or batch file.

Я также пытался subprocess.Popen, который возвращает тот же результат НО он включает это в верхней части: C:\Eclipse\Workspace\example>setup.py build ... мммммм ...

UPDATE:

Я решил запустить Команда os.system в том же каталоге, где хранится файл bat.bat (это ТАКЖЕ каталог, в котором хранится файл setup.py)

звонок теперь должен быть таким простым.

import os
os.system('bat.bat')     note: (run from pydev)

результат:

E:\App\FPtest\retryURL\Temp_installed>setup.py build 
Traceback (most recent call last):
  File "C:\Python31\lib\site.py", line 56, in <module>
    import os
  File "C:\Python31\lib\os.py", line 380, in <module>
    from _abcoll import MutableMapping  # Can't use collections (bootstrap)
  File "C:\Python31\lib\_abcoll.py", line 49
    class Hashable(metaclass=ABCMeta):
                            ^
SyntaxError: invalid syntax

Дополнительное примечание:

Если я запускаю любой «простой» файл .bat, все работает нормально. и если я запускаю файл .bat за пределами интерпретатора, он тоже работает нормально ... что заставляет меня поверить, что именно содержимое файла .bat вызывает проблему: setup.py build.
В этом случае содержимое файла .bat выполняет команду cx_freeze для остановки и запуска, но вышеупомянутая ошибка - то, что возвращается, когда я пытаюсь это

UPDATE:

Похоже, что он запускает 'os.system (' bat.bat ') или эквивалентный подпроцесс успешно выполняет файл .bat, если он запускается из стандартного интерпретатора python. Так что это только неудачно, если запустить из Pydev

Ответы [ 3 ]

3 голосов
/ 25 декабря 2011

В Windows 2000 и более поздних версиях расширение .py связано с командой open, которая запускает интерпретатор.Это на самом деле делается во время установки.Но для запуска скрипта python через интерпретатор скрипт должен находиться в текущем каталоге или в одном из каталогов, объединенных в переменную среды path.

В вашем случае, если setyp.py присутствуетв некоторых случаях, и путь является абсолютным, вы можете сделать следующее

path=%path%;<directory containing setup.py>

С другой стороны, если файл setup.py находится в относительном каталоге вашего пакетного файла, который не является абсолютным путем.Вам необходимо указать полный относительный путь из текущего местоположения командного файла.Что-то вроде

..\<sub directory>\setyp.py #If the script is below the current path

или

.\<sup directory>\setyp.py #If the script is above the current path

Примечание *** Вы также можете запустить сценарий без расширения (не рекомендуется), если в переменной среды PATHEXT присутствует .py.

0 голосов
/ 25 декабря 2011

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

Вместо использования файла .bat ... Размещение содержимого файла .bat внутри подпроцесса .py работает

подпроцесс импорта
subprocess.Popen ('python -E setup.py build')

0 голосов
/ 25 декабря 2011

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

В Windows это можно сделать, щелкнув правой кнопкой мыши Мой компьютер -> Свойства -> Дополнительно (левая панель в Windows 7) -> Переменные среды.Проще проложить путь вперед и убедиться, что есть;между вашей записью и началом переменной пути как есть .... НЕ УДАЛЯЙТЕ СОДЕРЖАНИЕ УЖЕ ТАМ.

...