質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2522閲覧

Pythonでファイル出力シェルを呼び出した場合の挙動について

kappan

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/05/31 10:01

編集2018/06/01 01:56

前提・実現したいこと

Python3.6.5からシェルを実行したいのですが、シェル内にファイル書き出し処理があるためか正常に動作しません。
シェル側はcsvファイルの文字列を置換し、別ファイルに出力する処理です。

##出力結果
file.csvが0byte

該当のソースコード

python側該当箇所

xxx.py

1subprocess.run(["/batch/output.sh", "xxx.csv"])

シェル側問題箇所

output.sh

1sed -e "s/\r//" /tmp/xxx.csv > /export/file.csv

補足情報

Django2を使ったwebアプリ上で動作します。
/batch/output.shをコマンド実行すると正常に動作します。

追記

シェルの手動実行・・・ok
test.py の実行・・・ok

test.py

1#!/usr/bin/env python 2import subprocess 3res = subprocess.run(["xxx.sh", "test.csv"], stdout=subprocess.PIPE) 4print(res)

Webアプリ(Django)からの実行・・・NG

権限、PATH、Django仕様あたりを調べてみます。

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

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

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

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

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

mkgrei

2018/05/31 13:04

どのような正常ではないことが起きたのでしょうか。
kappan

2018/06/01 01:30

Webアプリからoutput.shを実行すると、file.csvが0byteとなります。output.shをターミナルからの手動実行をすると正常な結果を取得できます。
guest

回答2

0

Python

1subprocess.run(["/batch/output.sh", "xxx.csv"]) 23subprocess.run(["/batch/output.sh", "/tmp/xxx.csv"])

フルパスで記載すればよい、というシンプルな対応でいかがでしょうか。

おそらくDjango経由の場合、カレントディレクトリがWebサーバのプロセスのカレントになるため、書き込み権限が無くて何も書き出されず、空のファイルを入力としてsedしてるのでfile.csvも空になる。という流かと思います。

投稿2018/06/01 02:00

kazto

総合スコア7196

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

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

kappan

2018/06/01 02:10

回答ありがとうございます。 どうやら直前にファイルアップロードして、そのファイルを操作すると0byteになるようです。 views.py -- 1.ファイルアップロード処理 2.シェル実行処理 -- 1でアップしたファイルを2で処理すると0byte 直前にアップロードしたファイル以外を処理すると正常
guest

0

自己解決

ご意見、ご回答ありがとうございます。
結論を言いますと、ファイルクローズ漏れが原因でした。

--views.py--
//ファイルアップロード処理
destination = open(path, 'wb')

destination.close() ←追記
//アップロードファイルをシェルで操作
subprocess.run([SHELL_DIR + "xxx.sh", file.name], stdout=subprocess.PIPE)

投稿2018/06/01 04:17

編集2018/06/01 04:55
kappan

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問