🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8407閲覧

python  import subprocess CDで移動できない

koikogarey

総合スコア52

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/09 03:41

編集2019/04/09 04:27

図3
イメージ説明

図4
イメージ説明

import subprocessでcdが使えません。
CDができずエラーになります。ちなみに2から5行目を削除し
LSだけだとうまく結果が表示されます。

ためしたコード manage-file.pyの中身

import subprocess cmd = "cd tensor" runcmd = subprocess.call(cmd.split()) print (runcmd) cmd = "ls -l" runcmd = subprocess.call(cmd.split()) print (runcmd)

打ったコマンド

python3 manage-file.py

エラー内容

Traceback (most recent call last): File "manage-file.py", line 4, in <module> runcmd = subprocess.call(cmd.split()) File "/usr/lib/python3.5/subprocess.py", line 247, in call with Popen(*popenargs, **kwargs) as p: File "/usr/lib/python3.5/subprocess.py", line 676, in __init__ restore_signals, start_new_session) File "/usr/lib/python3.5/subprocess.py", line 1282, in _execute_child raise child_exception_type(errno_num, err_msg) FileNotFoundError: [Errno 2] No such file or directory: 'cd'

証拠shot
LINUXでコピーできないのでキャプチャで送らせて頂きます

イメージ説明

tensorファイルがカレントディレクトリにある証拠です。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

cdはシェルコマンドといって、シェルに内蔵されている機能です。外部に実行ファイルが存在するlsなどとはそもそも異なります。

pythonでcd相当のことをしたければ、os.chdir(path)などが適当です。

面倒だし副作用があるので、最初から"ls -l tensor"というのも手です。

投稿2019/04/09 04:19

編集2019/04/09 04:30
hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koikogarey

2019/04/09 04:28

図3図4を本文に画像を挿入しました。結論から言うと /home /bin/sh: 1: cd: can't cd to tensor /home と出て移動できませんでした。
hayataka2049

2019/04/09 04:31

起動時のカレントディレクトリ次第ですが、単にos.chdir("tensor")で移動できませんか?
koikogarey

2019/04/09 04:32

すぐためします。
koikogarey

2019/04/09 04:34

できませんでした。 /home/xxx/tensor <class 'str'> /home/xxx/tensor /bin/sh: 1: cd: can't cd to tensor /home/xxx/tensor xxx@cloudshell:~ (mojiokoshi-test)$
koikogarey

2019/04/09 04:35

もちろん手でコマンド叩けば速攻で変わります xxx@cloudshell:~ (mojiokoshi-test)$ cd tensor xxx@cloudshell:~/tensor (mojiokoshi-test)$
hayataka2049

2019/04/09 04:36

もともと置いていたsubprocess.callでcdしようとしている部分は消してください
koikogarey

2019/04/09 04:42

エラーすら記載されずディレクトリは変更されませんでした
koikogarey

2019/04/09 04:43

私は難しい事を質問しているのでしょうか? ディレクトリを1つ下げてファイルを実行する事すらできないのでしょうか? 非常に無念です。
koikogarey

2019/04/09 04:44

import os os.chdir("tensor")
koikogarey

2019/04/09 04:44

対象コードです。
koikogarey

2019/04/09 04:44

対象コードです。
hayataka2049

2019/04/09 04:46 編集

エラーが出ないなら上手く行っているのでは? 少なくともchdir自体は cmd = "ls -l" runcmd = subprocess.call(cmd.split()) print (runcmd) に戻してlsできるかどうか確認しましょう。
koikogarey

2019/04/09 04:46

エラーがでていませんが、ディレクトリが変更されていません。 コードすぐためします。
hayataka2049

2019/04/09 04:48

chdirで変更できるのはpythonを実行している間だけですね。実行が終わったらもとに戻ります。
hayataka2049

2019/04/09 04:48

上のコメントのコードはchdirで移動した後に実行されるようにしてください。
koikogarey

2019/04/09 04:49

かわりません xxx@cloudshell:~ (mojiokoshi-test)$ python3 manage-file.py -rw-r--r-- 1 xxx xxx 515 Apr 9 13:40 manage-file.py 0 xxx@cloudshell:~ (mojiokoshi-test)$
koikogarey

2019/04/09 04:51

なるほど。 現在xxxにいるとします 例えば、xxxの中にAフォルダとBフォルダがあるとします。 Aフォルダには1.py、Bフォルダには2.pyがあります。 xxx   Aフォルダ     --1py   Bフォルダ     --2py どんなに1pyの中でディレクトリを移動させても、シェルに戻った時は1.pyという事でしょうか?
hayataka2049

2019/04/09 04:51

import os import subprocess os.chdir("tensor") subprocess.call("ls") が成功するかどうかまず試してください。
koikogarey

2019/04/09 04:51

質問2 1pyの中では、Bフォルダに移動したり、2pyを実行したりできるという事でしょうか?
hayataka2049

2019/04/09 04:53

>どんなに1pyの中でディレクトリを移動させても、シェルに戻った時は1.pyという事でしょうか? シェルのカレントディレクトリがAフォルダなら、os.chdirでいくら移動しようとプログラムが終わればAフォルダです
koikogarey

2019/04/09 04:54

ためしました。エラーはでずにディレクトリにあるファイルが表示されました。 現在フォルダ移動は行われていません。 @cloudshell:~ (mojiokoshi-test)$ python3 manage-file.py manage-file.py @cloudshell:~ (mojiokoshi-test)$
koikogarey

2019/04/09 04:54

シェルのカレントディレクトリは説明とおりxxxです
koikogarey

2019/04/09 04:54

xxx →→→→→→→→→→イマココです   Aフォルダ     --1py   Bフォルダ     --2py
koikogarey

2019/04/09 04:59 編集

xxxにはmanage-file.pyというソースがあります。 manage-file.pyで Aフォルダの1pyと Bフォルダの2pyを実行したいです。 manage-file.pyで cmd = "cd a" runcmd = subprocess.call(cmd.split()) print (runcmd) とコマンド打つとエラーが出ます。プログラムが終わった後の話ではありません。 manage-file.py の中の上記コマンドの話です。 pyの中でディレクトリ移動できません。
hayataka2049

2019/04/09 04:58

長いと読みづらいので、できるだけコメントは一つにまとめてください。 とりあえず上の続きですが、 import os import subprocess print(os.getcwd()) os.chdir("tensor") print(os.getcwd()) subprocess.call("ls") と実行して何が出るか確認してください。
koikogarey

2019/04/09 05:00

一言でいうと、py実行中のDir移動の話で、pgm起動後のSHELLの話ではありません
koikogarey

2019/04/09 05:02

以下実行結果です。 xxx@cloudshell:~ (mojiokoshi-test)$ python3 manage-file.py /home/xxx /home/xxx/tensor xxx@cloudshell:~ (mojiokoshi-test)$
koikogarey

2019/04/09 05:03

os.chdir("tensor") print(os.getcwd()) でいけてるっ!「/home/xxx/tensor」
koikogarey

2019/04/09 05:03

再度チェックします
koikogarey

2019/04/09 05:03

めちゃ嬉しいです。ありがとうございます
hayataka2049

2019/04/09 05:04 編集

lsの実行結果が出ていないので、tensorディレクトリが空なんじゃないですかね
koikogarey

2019/04/09 05:10

できた泣 こんなわたしでも出来ました泣 ありがとうございます。hayatakaさん優しいだけじゃなくて正確だから大好き♡
guest

0

私の環境では同じコードで実行できたので、環境によるものかもしれません。
引数にshell=Trueを追加するといかがでしょうか?

runcmd = subprocess.call(cmd.split(), shell=True)

追記
pythonは別プロセスで実行するので、python内でディレクトリを移動しても、終了すればディレクトリは元の場所に戻ってしまいます。
もしディレクトリ移動、python実行、ディレクトリ確認をまとめてやりたいのでしたら、それを行うスクリプトを用意すると良いでしょう。
見たところWindowsで動かしているようですので、以下のbatを作成して実行してみてください。

cd tensor python3 manage-file.py dir

投稿2019/04/09 03:58

編集2019/04/09 04:33
y.nakamura

総合スコア190

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

koikogarey

2019/04/09 03:58

すぐに試してみます
koikogarey

2019/04/09 04:04

できませんでした。直近のコード4行のキャプチャを貼りました。
koikogarey

2019/04/09 04:05

実行結果は、ゼロが返らずにディレクトリも変わりません。
koikogarey

2019/04/09 04:09

現在のディレクトリの中にtensorがある証拠です。 コマンドは python3 でうってます。
y.nakamura

2019/04/09 04:15 編集

subprocessでcdを実行しても、元のプロセスには反映されないのだと思います。 以下のコマンドを確認してみてください。 runcmd = subprocess.call('pwd; cd misc; pwd', shell=True)
y.nakamura

2019/04/09 04:14

元プロセスのカレントディレクトリを変更したいのでしたら、os.chdir('tensor')を使えば期待する動きになるかもしれません。
y.nakamura

2019/04/09 04:16 編集

すみません、2つ前のコメントのディレクトリ指定を間違えました。 runcmd = subprocess.call('pwd; cd tensor; pwd', shell=True)
koikogarey

2019/04/09 04:15

エラーがでました。 xxx@cloudshell:~ (mojiokoshi-test)$ python3 manage-file.py /home/xxx /bin/sh: 1: cd: can't cd to misc /home/xxx xxx@cloudshell:~ (test)$
koikogarey

2019/04/09 04:17

やりたい事は、tensorフォルダへ変更したいだけです。 tensorフォルダの中に沢山ファイルがあるので、tensorフォルダに移動したいです。
koikogarey

2019/04/09 04:17

新しいコードすぐ試します。
koikogarey

2019/04/09 04:18

試しました。エラーは出ませんでしたが、ディレクトリが変更されていません。 xxx@cloudshell:~ (mojiokoshi-test)$ python3 manage-file.py /home/xxx /home/xxx/tensor xxx@cloudshell:~ (mojiokoshi-test)$ dir manage-file.py original project4 README-cloudshell.txt README-clouldshell.txt tensor xxx@cloudshell:~ (mojiokoshi-test)$
y.nakamura

2019/04/09 04:24

やはりsubprocess.call内だとディレクトリが移動されていますね。
koikogarey

2019/04/09 04:31

そうですね。 /home/xxx /home/xxx/tensor となっていますが、xxxに戻っています。 やりたい事は、tensorフォルダへ変更したいだけですが。。。3時間はまりとてもはがゆいです。
y.nakamura

2019/04/09 04:31

回答に追記しました。
koikogarey

2019/04/09 04:39

スクリプトですか。。python内ではディレクトリ移動はできないのですか? 例えば、tensorの中にAフォルダとBフォルダがあるとします。 Aフォルダには1.py、Bフォルダには2.pyがあります。 Aフォルダ--1py Bフォルダ--2py この場合python内の記載で簡潔できないのでしょうか? しディレクトリ移動、python実行、ディレクトリ確認をまとめてやりたいのでしたら、
y.nakamura

2019/04/09 04:46

python内でディレクトリ移動は可能ですが、そのpythonが終了した時点で、元のディレクトリに戻ってしまいます。 python内のディレクトリ移動は以下の記述で可能です。 import os os.chdir('tensor')
y.nakamura

2019/04/09 04:48

manage-file.pyを実行するだけで、A/1.pyとB/2.pyもまとめて実行したいということでしょうか?
koikogarey

2019/04/09 05:11

ありがとうございます。おっしゃったコマンドで起動を確認できました。
koikogarey

2019/04/09 05:12

そうです。manage-file.pyを実行するだけで、 A/1.pyとB/2.pyもまとめて実行したいということです。 Aのディレクトリに移動 1.pyを実行 Bのディレクトリに移動 2.pyを実行 これをmanage-file.pyで書けばいいという事ですよね?
koikogarey

2019/04/09 05:13

manage-file.py内で ディレクトリを戻るのも cd .. では、出来ないという事ですよね?
koikogarey

2019/04/09 05:15

お二人とも大変丁寧でしたのでベストアンサーにしたいのですが、どうすればよろしいでしょうか?本当にありがとうございます。
koikogarey

2019/04/09 05:31

大変丁寧な回答頂きましたがタッチのスピードで他の方をベストアンサーとさせて頂きます。しかし本当にありがとうございました。とても丁寧で好感もてます。
koikogarey

2019/04/09 05:31

引き続きよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問