подпроцесс python popen устанавливает домашний каталог как cwd - PullRequest
0 голосов
/ 28 августа 2018

У меня небольшая проблема. Я нахожусь на машине с Ubuntu 16.04 и в скрипте Python я хочу запустить подпроцесс, который должен начаться в домашнем каталоге пользователя. Я попробовал это с:

subprocess.Popen('echo "Test"', cwd="~", shell=True,universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable="/bin/bash")

но когда я делаю это, я получаю следующую ошибку:

 proc = subprocess.Popen('echo "test"', cwd="~", shell=True,universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable="/bin/bash")
  File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '~'

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

1 Ответ

0 голосов
/ 28 августа 2018

Я упростил ваш код для ясности.


С Python 3.6 или выше вы можете сделать следующее:

import subprocess, pathlib
subprocess.Popen(['echo',  'test'], cwd=pathlib.Path.home())

С Python 3.5 вам нужно обернуть Path.home() в str():

import subprocess, pathlib
subprocess.Popen(['echo',  'test'], cwd=str(pathlib.Path.home()))

С любой версией Python ниже 3.5 вы можете использовать:

import os, subprocess
subprocess.Popen(['echo',  'test'], cwd=os.path.expanduser('~'))
...