запустить скрипт .sh из python, который запускает другой процесс - PullRequest
0 голосов
/ 16 ноября 2018

Я искал ответ в StackOverflow, но большинство из них не решают всю мою задачу.

У меня есть программное обеспечение cellprofiler, которое работает с собственным графическим интерфейсом и работает в среде conda в Ubuntu.

Я хочу автоматизировать внешний запуск этого cellprofiler с помощью другого скрипта Python.

Мои шаги:

1) Я создаю bash-скрипт на python, который запускает среду и программное обеспечение:

env_activate = 'path_to_sh/activate_env.sh'
with open(env_activate, 'w') as f:
    f.write('#!/bin/sh\n')
    f.write('. activate cellprofiler && cellprofiler')
    f.close()

2) В моем скрипте на python я делаю:

processCP = subprocess.Popen(env_activate, stdout=subprocess.PIPE)
processCP.wait()

но это приводит к запуску его в системном интерпретаторе python 3.5, а не в среде conda

Traceback (most recent call last):
  File "/home/**/.local/bin/cellprofiler", line 6, in <module>
    from pkg_resources import load_entry_point
  File "/home/**/.local/lib/python3.5/site-packages/pkg_resources/__init__.py", line 3126, in <module>
    @_call_aside
  File "/home/**/.local/lib/python3.5/site-packages/pkg_resources/__init__.py", line 3110, in _call_aside
    f(*args, **kwargs)
  File "/home/**/.local/lib/python3.5/site-packages/pkg_resources/__init__.py", line 3139, in _initialize_master_working_set
    working_set = WorkingSet._build_master()
  File "/home/**/.local/lib/python3.5/site-packages/pkg_resources/__init__.py", line 581, in _build_master
    ws.require(__requires__)
  File "/home/**/.local/lib/python3.5/site-packages/pkg_resources/__init__.py", line 898, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/home/**/.local/lib/python3.5/site-packages/pkg_resources/__init__.py", line 784, in resolve
    raise DistributionNotFound(req, requirers)

    pkg_resources.DistributionNotFound: The 'CellProfiler' distribution was not found and is required by the application

Кто-нибудь знает, почему это происходит?

UPDATE: Мне нужен интерпретатор python python2.7, который уже находится в среде conda. Cellprofiler работает правильно, если вызывать его в терминале, например:

source activate cellprofiler
cellprofiler

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Чтобы ответить на мой собственный вопрос: это помогло прочитать Запуск подпроцесса в рамках различных virtualenv с python

Итак, нужно использовать subprocess.Popen для создания процесса. Другой хитростью было использование she-ban #!/bin/bash\n в скрипте bash. ведь он был создан как:

 env_activate = 'path_to/activate_env.sh'
 with open(env_activate, 'w') as f:
        f.write('#!/bin/bash\n')
        f.write('source activate cellprofiler\n')
        f.write('cellprofiler')
        f.close()

и управляется:

processCP = subprocess.Popen(env_activate, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
0 голосов
/ 16 ноября 2018

Запуск в терминале

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