Windowsで動かす時 subprocess.run()の引数にshell=True が必要
sina2 opened this issue · comments
Windowsで動かす時 71行目を
return subprocess.run(args, check=True)
から
return subprocess.run(args, check=True,shell=True)
に変更したら動作しました。
こちらもありがとうございます。
いま手元に Windows マシンが無く確認できないので、もしよろしければ教えてください。元の return subprocess.run(args, check=True)
で動かした場合はどのような挙動になりますか?エラーメッセージなどが出るようであれば全文ご共有いただけますと幸いです。
参考: sina2@4629068
@sina2 重ねて質問させてください。お使いの Windows マシンでの次のスクリプトを実行したときの出力結果を教えてください。
import sys
print(sys.platform)
( Windows マシンでのみ shell=True
をつけるようにしたいと考えお伺いしています)
こちらもありがとうございます。
いま手元に Windows マシンが無く確認できないので、もしよろしければ教えてください。元の
return subprocess.run(args, check=True)
で動かした場合はどのような挙動になりますか?エラーメッセージなどが出るようであれば全文ご共有いただけますと幸いです。
windows10での手順ですが
1.Google Cloud SDK をデフォルトでインストールしました。 https://cloud.google.com/sdk/docs/install?hl=JA
2.WindowsからGoogle cloud SDK Shell を起動
3.https://ipv4.fetus.jp/cn.txt をダウンロードしてSJISで保存
4.https://github.com/gh640/gcp-block-country-ja/blob/main/gcp_block_country.py ダウンロード
5.Microsoft Store からPython3.9をインストール(python gcp_block_country.py --country-code cn --dry-run 初回実行時)
6.python gcp_block_country.py --country-code cn --dry-run 問題なし
7.python gcp_block_country.py --country-code cn で以下のエラーがでました。
C:\Users\sina\AppData\Local\Google\Cloud SDK>python gcp_block_country.py --country-code cn
Traceback (most recent call last):
File "C:\Users\sina\AppData\Local\Google\Cloud SDK\gcp_block_country.py", line 87, in
main()
File "C:\Users\sina\AppData\Local\Google\Cloud SDK\gcp_block_country.py", line 24, in main
create_rules(name_prefix, addresses, dry_run=dry_run)
File "C:\Users\sina\AppData\Local\Google\Cloud SDK\gcp_block_country.py", line 48, in create_rules
create_rule(name, chunk_addresses, dry_run=dry_run)
File "C:\Users\sina\AppData\Local\Google\Cloud SDK\gcp_block_country.py", line 71, in create_rule
return subprocess.run(args, check=True)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 501, in run
with Popen(*popenargs, **kwargs) as process:
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 947, in init
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.496.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 1416, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
C:\Users\sina\AppData\Local\Google\Cloud SDK>
以上 よろしくお願いいたします。
@sina2 重ねて質問させてください。お使いの Windows マシンでの次のスクリプトを実行したときの出力結果を教えてください。
import sys print(sys.platform)( Windows マシンでのみ
shell=True
をつけるようにしたいと考えお伺いしています)
print(sys.platform)の出力は以下の通りです。
C:\Users\sina\AppData\Local\Google\Cloud SDK>python
Python 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.platform)
win32
>>>
以上 よろしくお願いいたします。
@sina2 詳しくご説明くださりありがとうございます。理解しました。
フォークしたリポジトリの方でコミットされているものをそのままプルリクエストしていただければマージできればと思うのですが、いかがでしょう。もしその形でよければマージさせていただいて、その後に sys.platform == 'win32'
のときだけ shell=True
とする分岐処理を私の方で追加できればと思います。
こちらは自分用メモです。 shell=True
を使うアプローチの他に shutil.which()
を使うアプローチもあるようです(動作未確認)。
subprocess.call([shutil.which('gcloud'), arg1, arg2])
@sina2 詳しくご説明くださりありがとうございます。理解しました。
フォークしたリポジトリの方でコミットされているものをそのままプルリクエストしていただければマージできればと思うのですが、いかがでしょう。もしその形でよければマージさせていただいて、その後に
sys.platform == 'win32'
のときだけshell=True
とする分岐処理を私の方で追加できればと思います。
拙いプルリクエストですが送らせていただきました。
何かありましたら連絡ください。
@sina2 ありがとうございます。いただいたプルリクエストをマージさせていただきました :D
その後 shell=True
の有無を切り替えるために少しだけコードを変更しました:
4157c47#diff-2ebd22effce0307bb292b56a545465e8e0ec76aa3f23731e3097196be9723bd8L72-R78
こちらいったんクローズさせていただきますね。もし問題を発見されたらお知らせいただけますと幸いです 😃