sh скрипт, эквивалентный скрипту Python - PullRequest
1 голос
/ 05 сентября 2011

Хорошо, у меня следующая ситуация. Мне нужно редактировать PYTHONPATH динамически на целевом ПК. Сейчас структура проекта:

trunk
     bin
        start_script
     dependencies
        dependencies

Из python я мог сделать, из start_script:

root_path = os.path.split(os.path.dirname(os.path.abspath(__file__)))[0]
dependencies_root = os.path.join(root_path, 'dependencies')
from sys import path
path.extend([root_path, dependencies_root])

Это бы сработало, но мне нужно запустить новые процессы Python с помощью process.Popen, и изменения в sys.path к тому времени уже не видно.

Теперь я думал, что сценарий sh сделает эту работу лучше здесь, к сожалению, я здесь совершенно нуб и не знаю, как поступить. Скрипт sh должен делать в основном то, что делал питон сверху, поэтому:

[1] Get the absolute path of the directory the script is located
[2] Get the parent of that folder (say parent_path)
[3] export PYTHONPATH=$PYTHONPATH:parent_path
[4] python start_script.py

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

Ответы [ 3 ]

4 голосов
/ 05 сентября 2011

Вы можете просто обновить переменную окружения PYTHONPATH в тот же момент, когда вы обновляете sys.path в start_script, используя диктовку os.environ.

1 голос
/ 05 сентября 2011

Я бы использовал .pth файл. Смотри http://docs.python.org/install/index.html#inst-search-path

Файл .pth - это файл, состоящий из одного пути к каталогу на строку. Он вставит перечисленные каталоги в ваш путь к Python.

Это может быть лучше, чем выполнение сценариев оболочки со всеми ее недостатками (более сложная установка, перенос переноса и т. Д.)

0 голосов
/ 05 сентября 2011

Почему бы не использовать аргумент env для подпроцесса . Открыть ?

class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

Если env не None, это должно быть отображение, которое определяет переменные среды для нового процесса; они используются вместо наследования среды текущего процесса, что является поведением по умолчанию.

Или, если вы просто хотите запустить процесс python , вы можете просто использовать модуль multiprocessing .

Пример из документации:

from multiprocessing import Process

def f(name):
    print 'hello', name

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()
...