Quero executar um script dentro de um subdiretório / superdiretório (preciso estar dentro deste sub / superdiretório primeiro). Não consigo subprocess
entrar em meu subdiretório:
tducin@localhost:~/Projekty/tests/ve$ python
Python 2.7.4 (default, Sep 26 2013, 03:20:26)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> import os
>>> os.getcwd()
'/home/tducin/Projekty/tests/ve'
>>> subprocess.call(['cd ..'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/subprocess.py", line 524, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1308, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Python lança OSError e não sei por quê. Não importa se tento entrar em um subdiretório existente ou subir um diretório (como acima) - sempre acabo com o mesmo erro.
python
subprocess
Ducin
fonte
fonte
os.chdir()
vez disso.Respostas:
O que seu código tenta fazer é chamar um programa chamado
cd ..
. O que você quer é chamar um comando chamadocd
.Mas
cd
é um shell interno. Então você só pode chamá-lo deMas é inútil fazer isso. Como nenhum processo pode alterar o diretório de trabalho de outro processo (novamente, pelo menos em um sistema operacional semelhante ao UNIX, mas também no Windows), esta chamada fará com que o subshell altere seu diretório e saia imediatamente.
O que você deseja pode ser alcançado com
os.chdir()
ou com osubprocess
parâmetro nomeado,cwd
que altera o diretório de trabalho imediatamente antes de executar um subprocesso.Por exemplo, para executar
ls
no diretório raiz, você pode fazerou simplesmente
fonte
cd
geralmente também existe como binário, não apenas como um shell embutido. O verdadeiro problema do OP era que ele estava chamando um bináriocd ..
, sim. (E seu terceiro parágrafo teria sido seu próximo problema, então boa resposta.)cd
ser capaz de trabalhar como binário? Ele não pode cantar o dir de trabalho de seu pai./usr/bin/cd
consiste embuiltin cd "$@"
- portanto, também chama o shell embutidocd
.cd
deve ser implementado como um comando shell interno. Não há outra maneira de fazer isso. Os comandos internos do shell são executados no mesmo processo do shell. O que quero dizer com subshell é o shell executado parashell=True
. Ele pega o comando a ser executado, o executa e sai.Para executar
your_command
como um subprocesso em um diretório diferente, passe ocwd
parâmetro, conforme sugerido na resposta de @wim :Um processo filho não pode alterar o diretório de trabalho de seu pai ( normalmente ). Executar
cd ..
em um processo shell filho usando subprocesso não mudará o diretório de trabalho do script pai Python, ou seja, o exemplo de código na resposta de @glglgl está errado .cd
é um shell embutido (não um executável separado), ele pode alterar o diretório apenas no mesmo processo.fonte
Você deseja usar um caminho absoluto para o executável e usar o
cwd
kwarg dePopen
para definir o diretório de trabalho. Veja a documentação .fonte
subprocess.call(['ls', '-l'], cwd='/')
. Isso altera o cwd para/
e, em seguida, executals
com-l
como argumento. Mas se eu quiser fazeros.chdir('/')
e depoisopen('etc/fstab', 'r')
, não posso substituiros.chdir()
por nada,subprocess.XXX(cwd='/')
pois não vai adiantar, como disse. Estes são dois cenários completamente diferentes.cwd=
como pretendido. Eu também posso fazersubprocess.call(['bin/ls', '-l'], cwd='/')
.subprocess.call
e outros métodos nosubprocess
módulo têm umcwd
parâmetro.Este parâmetro determina o diretório de trabalho onde você deseja executar seu processo.
Então você pode fazer algo assim:
Confira docs subprocess.popen-constructor
fonte
Outra opção com base nesta resposta: https://stackoverflow.com/a/29269316/451710
Isso permite que você execute vários comandos (por exemplo
cd
) no mesmo processo.fonte
shell=True, executable='/bin/bash'
Acho que hoje em dia você faria:
fonte
Se você precisar mudar de diretório, execute um comando e obtenha a saída std também:
fonte
Se você deseja ter a funcionalidade cd (assumindo shell = True) e ainda deseja alterar o diretório em termos do script Python, este código permitirá que os comandos 'cd' funcionem.
fonte