gh640 / gcp-block-country-ja

🚧 (Japanese) Google Cloud Platform で特定の国からのアクセスをブロックするルールを一括作成するサンプルスクリプト

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Windowsで動かす時 subprocess.run()の引数にshell=True が必要

sina2 opened this issue · comments

commented

Windowsで動かす時 71行目を
return subprocess.run(args, check=True)
から
return subprocess.run(args, check=True,shell=True)
に変更したら動作しました。

こちらもありがとうございます。

いま手元に Windows マシンが無く確認できないので、もしよろしければ教えてください。元の return subprocess.run(args, check=True) で動かした場合はどのような挙動になりますか?エラーメッセージなどが出るようであれば全文ご共有いただけますと幸いです。

@sina2 重ねて質問させてください。お使いの Windows マシンでの次のスクリプトを実行したときの出力結果を教えてください。

import sys

print(sys.platform)

( Windows マシンでのみ shell=True をつけるようにしたいと考えお伺いしています)

commented

こちらもありがとうございます。

いま手元に 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>

以上 よろしくお願いいたします。

commented

@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])

参考: https://stackoverflow.com/questions/3022013/windows-cant-find-the-file-on-subprocess-call#answer-32799942

commented

@sina2 詳しくご説明くださりありがとうございます。理解しました。

フォークしたリポジトリの方でコミットされているものをそのままプルリクエストしていただければマージできればと思うのですが、いかがでしょう。もしその形でよければマージさせていただいて、その後に sys.platform == 'win32' のときだけ shell=True とする分岐処理を私の方で追加できればと思います。

拙いプルリクエストですが送らせていただきました。
何かありましたら連絡ください。

@sina2 ありがとうございます。いただいたプルリクエストをマージさせていただきました :D

その後 shell=True の有無を切り替えるために少しだけコードを変更しました:

4157c47#diff-2ebd22effce0307bb292b56a545465e8e0ec76aa3f23731e3097196be9723bd8L72-R78

こちらいったんクローズさせていただきますね。もし問題を発見されたらお知らせいただけますと幸いです 😃