Почему переменные окружения не могут установить в Python, сохраняются?

Предполагая, что ваши наблюдаемые генерируют список элементов, вы, вероятно, захотите выполнить операцию фильтрации для коллекции, а не для наблюдаемой. Есть несколько способов сделать это. Вы можете добиться этого с помощью простой карты flatMap + или с помощьюlateLatest / zip, как вы упомянули.

Примеры написаны на Kotlin.

val observable1 = Observable.just((1..10 step 2).toList()) // Odd integers between 1 and 10
val observable2 = Observable.just((1..10).toList()) // Integers between 1 and 10

Плоская карта + карта

observable1.flatMap { result1 ->
    observable2.map { result2 -> result2 - result1 }
}.subscribe { println(it.toString()) }

CombineLatest

Observable.combineLatest<List<Int>, List<Int>, List<Int>>(
    observable1,
    observable2,
    BiFunction { result1, result2 ->
        result2.filter { item ->
            !result1.contains(item)
        }
    })
    .subscribe { println(it.toString()) }

Zip

Observable.zip<List<Int>, List<Int>, List<Int>>(
    observable1,
    observable2,
    BiFunction { result1, result2 ->
        result2 - result1
    })
    .subscribe { println(it.toString()) }

Все эти выходные данные:

[2, 4, 6, 8, 10]

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

observable1.flatMap { result1 ->
    observable2.flatMapIterable { result2 -> result2 }
        .filter { item -> !result1.contains(item) }
}.subscribe { println(it.toString()) }

Выход:

2
4
6
8
10
40
задан physicsmichael 3 April 2009 в 22:55
поделиться

5 ответов

Вы не можете сделать этого из Python, но некоторые умные приемы удара могут сделать что-то подобное. Основное обоснование - это: переменные среды существуют в пространстве памяти для каждого процесса. Когда новый процесс создается с ветвлением (), это наследовало переменные среды своего родителя. Когда Вы устанавливаете переменную среды в своей оболочке (например, удар) как это:

export VAR="foo"

То, что Вы делаете, говорит удару устанавливать переменный VAR в своем пространстве процесса к "нечто". Когда Вы запускаете программу, колотите ветвление использования () и затем должностное лицо () для запущения программы, таким образом, что-либо, что Вы выполняете от удара, наследовало переменные среды удара.

Теперь, предположите, что Вы хотите создать удар, управляют, чтобы установил некоторые ДАННЫЕ переменной среды с содержанием из файла в Вашем текущем каталоге, названном ".data". Во-первых, у Вас должна быть команда для вытаскивания данных из файла:

cat .data

Это печатает данные. Теперь, мы хотим создать команду удара для установки тех данных в переменной среды:

export DATA=`cat .data`

Та команда берет содержание .data и помещает его в ДАННЫЕ переменной среды. Теперь при помещении той внутренней части команда псевдонима у Вас есть удар, управляют, чтобы установил Вашу переменную среды:

alias set-data="export DATA=`cat .data`"

Можно поместить ту команду псевдонима в .bashrc или .bash_profile файлах в корневом каталоге для имения той команды в наличии в любой новой оболочке удара, которую Вы запускаете.

32
ответ дан Benson 27 November 2019 в 01:47
поделиться

При установке переменных среды в рамках сценария Python (или любой другой сценарий или программа), это не будет влиять на родительскую оболочку.

Разъяснение редактирования: Таким образом, ответ на Ваш вопрос да, это верно. Можно однако экспортировать из сценария оболочки и получить его при помощи точечного вызова

в fooexport.sh

export FOO="bar"

в командной строке

$ . ./fooexport.sh
$ echo $FOO
bar
3
ответ дан Stefano Borini 27 November 2019 в 01:47
поделиться

Одно обходное решение должно произвести export команды, и имеют родительскую оболочку, оценивают это..

thescript.py:

import pipes
import random
r = random.randint(1,100)
print("export BLAHBLAH=%s" % (pipes.quote(str(r))))

.. и псевдоним удара (то же может быть сделано в большинстве оболочек.. даже tcsh!):

alias setblahblahenv="eval $(python thescript.py)"

Использование:

$ echo $BLAHBLAH

$ setblahblahenv
$ echo $BLAHBLAH
72

Можно произвести любой произвольный код оболочки, включая несколько команд как:

export BLAHBLAH=23 SECONDENVVAR='something else' && echo 'everything worked'

Просто не забудьте быть осторожными относительно выхода из любого динамично созданного вывода ( pipes.quote модуль хорош для этого),

20
ответ дан dbr 27 November 2019 в 01:47
поделиться

То, что мне нравится делать, использовать/usr/bin/env в сценарии оболочки, чтобы "перенести" мою командную строку, когда я оказываюсь в аналогичных ситуациях:

#!/bin/bash

/usr/bin/env NAME1="VALUE1" NAME2="VALUE2" ${*}

Поэтому давайте назовем этот сценарий "myappenv". Я поместил его в свой каталог $HOME/bin, который я имею в своем $PATH.

Теперь я могу вызвать любую команду с помощью той среды путем простого предварительного ожидания "myappenv" как таковой:

myappenv dosometask -xyz

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

Измененная версия на основе новых комментариев

#!/bin/bash

/usr/bin/env G4WORKDIR=$PWD ${*}

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

2
ответ дан Joe Holloway 27 November 2019 в 01:47
поделиться

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

Возможно, можно установить их в .bashrc, .profile или эквивалент "работает на входе в систему", или "работает на каждом новом терминальном сеансе" сценарий в MacOS.

У Вас может также быть Python, запускают программу моделирования с желаемой средой. (используйте env параметр для подобрабатывания. Popen (http://docs.python.org/library/subprocess.html))

import subprocess, os
os.chdir('/home/you/desired/directory')
subprocess.Popen(['desired_program_cmd', 'args', ...], env=dict(SOMEVAR='a_value') )

Или у Вас мог быть Python, выписывают сценарий оболочки как это в файл с a .sh расширение:

export SOMEVAR=a_value
cd /home/you/desired/directory
./desired_program_cmd

и затем chmod +x это и выполненный это отовсюду.

1
ответ дан Joe Koberg 27 November 2019 в 01:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: