Python, os.system дает сбой, когда скрипт находится не в той же папке

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

У меня есть скрипт, который выполняет эту команду bat, используя:
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 ... мммммм ...

ОБНОВЛЕНИЕ:

Я решил запустить команду 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 для замораживания и выполнения, но указанная выше ошибка возвращается, когда я пытаюсь это сделать.

ОБНОВЛЕНИЕ:

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


person Rhys    schedule 25.12.2011    source источник
comment
Где setup.py? Вам нужно либо а) указать полный путь к setup.py в вашем bat.bat, либо б) добавить папку, содержащую setup.py, в вашу переменную PATH (в Linux: export PATH=$PATH:/path/to/folder/containing/setuppy).   -  person mathematical.coffee    schedule 25.12.2011
comment
Кажется, это настоящий коктейль на случай катастрофы. Я пытаюсь запустить bat-файл из pydev. который работает нормально. но я хочу, чтобы файл bat выполнял cx_freeze, чтобы заморозить другую программу. Я сделал обходной путь и перешел к указанной выше ошибке, но обнаружил еще одну, которую я добавлю выше.   -  person Rhys    schedule 25.12.2011
comment
У меня очень похожая проблема с Pydev в Mac OS X — внешняя команда, которая отлично работает в интерпретаторе Python в терминале, но не в Pydev. Мне очень интересно понять, что происходит не так и как это исправить.   -  person acjay    schedule 09.01.2012


Ответы (3)


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

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

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

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

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

or

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

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

person Abhijit    schedule 25.12.2011
comment
setup.py не выполняется из интерпретатора, и мне это тоже не нужно. Файл .bat выполняется из интерпретатора. setup.py является частью команды cx_freeze (находится ВНУТРИ файла .bat) и используется для вызова cx_freeze для замораживания исполняемого файла. Я также обновил исходный пост. спасибо - person Rhys; 25.12.2011
comment
теперь, когда вы упомянули об этом, первой строкой, ведущей к моей новой ошибке, является «E:\Deepthroat\FPtest\retryURL\Temp_installed›setup.py build»… разве она не должна читаться как «E:\App\FPtest\retryURL\ Temp_installed›bat.bat' Файл .bat должен выполняться из интерпретатора - person Rhys; 25.12.2011
comment
@Rhys, на самом деле ты ищешь не в том месте. Файл Bat был выполнен правильно, когда вы запустили пакетный файл и попытались вызвать setup.py без интерпретатора Python в качестве префикса, Windows пытается найти связь py с любой открытой командой. Здесь он пытается найти setup.py и не может его найти. - person Abhijit; 25.12.2011
comment
Но как он может выйти из строя, потому что, когда я вручную запускаю файл .bat без интерпретатора, он работает отлично. - person Rhys; 25.12.2011
comment
Я только что обнаружил, что запуск 'os.system('bat.bat') или эквивалентного подпроцесса успешно выполняет .bat (и файл bat тоже выполняется успешно), если os.system запускается из стандартного интерпретатора python. это не удается только при использовании Pydev - person Rhys; 25.12.2011
comment
Привет еще раз, я получил следующий код для работы subprocess.Popen('python -E setup.py build'). Мне даже не нужен файл .bat с этим методом. У меня есть последний вопрос, который, я думаю, вы пытались объяснить... как я могу включить пункт назначения для сборки 'python -E setup.py'. Я пытаюсь использовать этот subprocess.Popen('E:/App/FPtest/retryURL/Temp_installed/python -E setup.py build'), но он не работает. Помогите, пожалуйста - person Rhys; 25.12.2011

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

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

person odgrim    schedule 25.12.2011
comment
спасибо, я начал немного путаться вокруг «проще просто приклеить» не твоя вина, я не знаком с этим - извините - person Rhys; 25.12.2011

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

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

import subprocess
subprocess.Popen('python -E setup.py build')

person Rhys    schedule 25.12.2011