1. ホーム
  2. python

[解決済み] サブプロセスのディレクトリ変更

2022-06-15 21:32:20

質問

サブディレクトリ/スーパーディレクトリの中でスクリプトを実行したい(まずこのサブディレクトリ/スーパーディレクトリの中にいる必要がある)。私は得ることができない subprocess を私のサブディレクトリに入れることができません。

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はOSErrorを投げますが、なぜかわかりません。既存のサブディレクトリに入ろうが、1つ上のディレクトリに入ろうが(上記のように)関係ありません - 私はいつも同じエラーで終わります。

どのように解決するのですか?

あなたのコードが行おうとしていることは、以下のようなプログラムを呼び出すことです。 cd .. . あなたがしたいのは cd .

しかし cd はシェルの内部構造です。ですから、これを呼び出せるのは

subprocess.call('cd ..', shell=True) # pointless code! See text below.

しかし、そうすることは無意味である。 どのプロセスも他のプロセスの作業ディレクトリを変更できないので (これも少なくとも UNIX 系 OS では、Windows でも同様)、 この呼び出しはサブシェルにそのディレクトリを変更させ、即座に終了させることになります。

あなたが望むことは os.chdir() で、あるいは subprocess という名前のパラメータ cwd で、サブプロセスを実行する直前に作業ディレクトリを変更します。

例えば ls をルートディレクトリで実行する場合、次のどちらかを行います。

wd = os.getcwd()
os.chdir("/")
subprocess.Popen("ls")
os.chdir(wd)

または単に

subprocess.Popen("ls", cwd="/")