Как установить сложные переменные среды для Linux в Python? - PullRequest
0 голосов
/ 17 октября 2018

Я знаю, что были подобные вопросы о stackoverflow, но я не мог найти ничего подобного этому.

Я пытаюсь автоматически устанавливать переменные окружения для openCV всякий раз, когда я запускаю код Python.

Вот код для их временной установки в linux:

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

В linux, когда я выводю переменную PATH, я получаю следующий вывод:

/usr/local/cuda-9.0/bin:/home/phil/.nvm/versions/node/v10.9.0/bin:/home/phil/bin:/home/phil/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Я использую следующеекод на python:

os.environ['PATH'] = "/usr/local/cuda-9.0/bin${PATH:+:${PATH}}"
os.environ['LD_LIBRARY_PATH'] = "/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}"

Но когда я повторяю PATH в python, я получаю точно такую ​​же строку для PATH.Что я могу сделать, чтобы python понимал $ {PATH: +: $ {PATH}}, как Linux?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

bash export оценивает результат непосредственно, как это:

giannis@local:~ > export TEST_VAR=$PATH
giannis@local:~ > echo $TEST_VAR
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

, тогда как важно помнить, что в python нативное поведение os.environ отличается от этого.os.environ в Python ведет себя как словарь на самом деле.Поэтому, когда вы попробуете это

os.environ['PATH'] = "/usr/local/cuda-9.0/bin${PATH:+:${PATH}}"

Это не будет оцениваться, как это было бы в native bash.Если вы хотите добиться того же поведения в Python, вы должны сделать это

в bash:

export SomeVariable="I am constructed in bash and the path is ${PATH}"

в Python, вы можете создать переменную, подобную этой

os.environ['some_key'] = "Like so: {something}".format(something=os.environ.get('SomeVariable', "")

так что в вашем случае вы могли бы добиться того же с чем-то вроде этого

os.environ['PATH'] = "/somthing/:{path}".format(path=os.environ['PATH']

0 голосов
/ 17 октября 2018

${PATH:+:${PATH}} - это синтаксис sh, используемый на языке программирования / сценариев sh.Linux не знает или не понимает этот синтаксис.

Поскольку вы используете Python, вы должны использовать вместо него синтаксис Python.

Вот документация Bash для этой функции:

   ${parameter:+word}
          Use Alternate Value.  If parameter is null or unset,
          nothing is  substituted,  otherwise  the expansion of word
          is substituted.

Таким образом, прямой перевод на Python будет:

((":" + os.environ['PATH']) if os.environ['PATH'] else "")

В этом нет ничего волшебного, на обоих языках это просто сокращение:

if os.environ['PATH']:
  # The path already had values, prepend ours with a colon:
  os.environ['PATH'] = "/usr/local/cuda-9.0/bin" + ":" + os.environ['PATH']
else:
  # The path was empty, just set it to our directory without a colon
  os.environ['PATH'] = "/usr/local/cuda-9.0/bin"

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

os.environ['PATH'] = "/usr/local/cuda-9.0/bin" + ":" + os.environ['PATH']

, тогда путь может в итоге составить всего /usr/local/cuda-9.0/bin:, а конечное двоеточие может потенциально вызвать проблемы, если добавить текущий каталог в путь поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...