お世話になっております。
質問のタイトルがわかりにくく申し訳ありません。情報を詰め込んだらこうなりました。
さて、本題ですが、該当のエラー、ソースコードなどは以下になります。
エラー
Error
1'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)
ソースコード
index.php
PHP
1<?php 2$command="/usr/bin/python3 test.py"; 3exec($command,$output); 4?>
test.py
Python
1# -*- coding: utf-8 -*- 2import csv 3import sys 4data=["aaa", "bbb", "ccc"] 5try: 6 f = open("日本語のファイル名000.csv", 'a',newline = "" ,encoding='utf-8') 7 csvWriter = csv.writer(f) 8 csvWriter.writerow(data) 9 f.close(data) 10except Exception as e: 11 error_log = open('error.log', 'w') 12 error_log.write(str(e)) 13 error_log.close() 14 raise
発生している問題
SSHでpython test.py
とするとエラー無く正常に動作します。しかし、PHPを通すと該当のエラーが発生してしまいます。
環境
Ubuntu 18.04.4 LTS
コードの編集はWinSCPから行っており、環境設定のデフォルト文字コードはUTRF-8に設定されています。
よろしくお願いします。
追記①
PHPのexec関数の引数を以下の2つで試してみましたがエラーは同じでした。
PHP
1$command="LANG=ja_JP.UTF-8 /usr/bin/python3 test.py"
PHP
1$command="PYTHONIOENCODING=UTF-8 /usr/bin/python3 test.py"
追記②
index.phpを以下のように編集しましたが、依然同じエラーです。
PHP
1$locale='ja_JP.UTF-8'; 2setlocale(LC_ALL,$locale); 3putenv('LC_ALL='.$locale); 4 5$command="/usr/bin/python3 test.py"; 6exec($command,$output);
また、Apacheのエラーログに少し詳細な情報が記録されていました。
Error
1Traceback (most recent call last): 2 File "test.py", line 12, in <module> 3 f = open("\u65e5\u672c\u8a9e\u306e\u30d5\u30a1\u30a4\u30eb\u540d000.csv", 'a',newline = "" ,encoding='utf-8') 4UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)
追記③
※いずれもエラーは解消されませんでした
Python側で環境変数を操作する方法
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
を挿入しました。
PHPは元のソースコードのままです。
Python
1# -*- coding: utf-8 -*- 2import csv 3import sys 4import io 5sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 6data=["aaa", "bbb", "ccc"] 7try: 8 f = open("日本語のファイル名000.csv", 'a',newline = "" ,encoding='utf-8') 9 csvWriter = csv.writer(f) 10 csvWriter.writerow(data) 11 f.close(data) 12except Exception as e: 13 error_log = open('error.log', 'w') 14 error_log.write(str(e)) 15 error_log.close() 16 raise
PHP側で環境変数を操作する方法
putenv("PYTHONIOENCODING=utf-8");
を挿入しました。
Pythonは元のソースコードのままです。上のPython側で環境変数を操作する方法のソースコードではありません。
PHP
1<?php 2putenv("PYTHONIOENCODING=utf-8"); 3$command="/usr/bin/python3 test.py"; 4exec($command,$output); 5?>
Apacheの実行ユーザを変更
etc/apache2/apache2.conf
を編集し、Apacheの実行ユーザをwww-data
から'SSH実行ユーザ'へ変更しました。
カレントディレクトリに出力されるエラーログの所有者がwww-data
から'SSH実行ユーザ'へ変更されていたので定義は正常に変更できたものと思われます。
訂正
質問に直接的な影響は無いのですが、元のソースコードのCSVファイルを閉じる部分の最終行。
Python
1f = open("日本語のファイル名000.csv", 'a',newline = "" ,encoding='utf-8') 2csvWriter = csv.writer(f) 3csvWriter.writerow(data) 4csvWriter.close(data)
とあったのですが、正しくは
Python
1f = open("日本語のファイル名000.csv", 'a',newline = "" ,encoding='utf-8') 2csvWriter = csv.writer(f) 3csvWriter.writerow(data) 4f.close(data) //この行を変更
でした。エラー該当箇所が今回の訂正箇所より前にあるためプログラムが強制終了してしまい影響は無いのですが一応訂正です。
本文ソースコードは既に訂正されています。
回答3件
あなたの回答
tips
プレビュー