Изменить рабочий каталог в оболочке с помощью скрипта Python - PullRequest
12 голосов
/ 24 сентября 2010

Я хочу реализовать команду userland, которая будет принимать один из своих аргументов (путь) и изменить каталог на этот каталог. После завершения программы я бы хотел, чтобы оболочка находилась в этом каталоге. Поэтому я хочу реализовать команду cd, но с внешней программой.

Может ли это быть сделано в скрипте Python, или я должен написать оболочку Bash?

Пример:

tdi@bayes:/home/$>python cd.py tdi
tdi@bayes:/home/tdi$>

Ответы [ 5 ]

15 голосов
/ 24 сентября 2010

Другие отметили, что вы не можете изменить рабочий каталог родителя от дочернего.

Но есть способ, которым вы можете достичь своей цели - если вы используете компакт-диск из функции оболочки, это может изменить рабочий каталог.Добавьте это к вашему ~ / .bashrc:

function go()
{
    cd $(python /path/to/cd.py "$1")
}

Ваш скрипт должен напечатать путь к каталогу, который вы хотите изменить.Например, это может быть ваш cd.py:

#!/usr/bin/python
import sys
if sys.argv[1] == 'tdi': print '~/long/tedious/path/to/tdi'
elif sys.argv[1] == 'xyz':  print '~/long/tedious/path/to/xyz'

Тогда вы можете сделать:

tdi@bayes:/home/$> go tdi
tdi@bayes:/home/tdi$> go tdi
4 голосов
/ 24 сентября 2010

Это не будет возможно.

Ваш скрипт выполняется в под-оболочке, порожденной родительской оболочкой, в которой была выполнена команда.

Любое выполнение cd в под-оболочке не влияет на родительскую оболочку.

1 голос
/ 24 сентября 2010

cd исключительно (?) Реализован как внутренняя команда оболочки, потому что любая внешняя программа не может изменить CWD родительской оболочки.

0 голосов
/ 16 июня 2017

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

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

fob=open(somefile,"w")
fob.write(dd)
fob.close()

"Somefile" может для удобства быть файлом на RAM-диске.Bash "mount" будет показывать tmpfs, смонтированные где-то вроде "/ run / user / 1000", поэтому somefile может быть "/ run / user / 1000 / pythonwkdir".«dd» - это полное имя пути к каталогу.

Файл Bash будет выглядеть так:

#!/bin/bash
#pysync ---Command ". pysync" will set bash dir to what Python recorded
cd `cat /run/user/1000/pythonwkdr`
0 голосов
/ 24 сентября 2010

Как пишет codaddict, то, что происходит в вашей вложенной оболочке, не влияет на родительскую оболочку.Однако, если ваша цель - предоставить пользователю оболочку в другом каталоге, вы всегда можете использовать Python os.chdir для изменения рабочего каталога вложенной оболочки, а затем запустить оболочку new из Python.Это не изменит рабочий каталог оригинальной оболочки, но оставит пользователя с другим в другом каталоге.

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