ベスパリブ

プログラミングを主とした日記・備忘録です

OpenSSLの"Unrecognized flag modules" エラー

以下のようなエラーが出て小一時間溶かしました。

OpenSSL> rsa -noout -modules -in private.key
rsa: Unrecognized flag modules
rsa: Use -help for summary.
error in rsa
OpenSSL> req -noout -modules -in server.csr
req: Unrecognized flag modules
req: Use -help for summary.
OpenSSL> x509 -noout -modules -in server.crt
x509: Unrecognized flag modules
x509: Use -help for summary.
error in x509

もしかして:modulus

OpenSSL> rsa -noout -modulus -in private.key
Modulus=D33DDA42F3XXXX...XXXXD431587DC9
OpenSSL> req -noout -modulus -in server.csr
Modulus=D33DDA42F3XXXX...XXXXD431587DC9
OpenSSL> x509 -noout -modulus -in server.crt
Modulus=D33DDA42F3XXXX...XXXXD431587DC9

modulus(モジュラス)とは

RSAモジュラス - Wikipedia

OpenSSLの"problem creating object tsa_policy1=1.2.3.4.1" エラー

環境

現象

証明書署名要求(CSR)の確認をするコマンドを行うと、2回目以降で以下のようなエラーが発生しました。

# 初回実行はうまく動作する
OpenSSL> req -text -noout -in localhost.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Kyoto, L = Sakyoku, O = hogehoge, CN = hogehoge.co.jp
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:eb:95:8d:d6:fc:53:fe:e7:3e:d7:ed:64:14:11:
                    28:de:d2:3b:2f:4a:a5:6b:fc:61:b0:8e:d3:bf:38:
                    59:15:a6:f6:d3:2a:48:7f:35:4d:12:aa:95:6e:ed:
                    dc:3e:bb:1a:e5:de:13:59:77:75:09:10:89:c9:3f:
                    ac:08:18:7a:ec
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        Attributes:
            a0:00
    Signature Algorithm: ecdsa-with-SHA256
         30:45:02:20:04:da:d9:e5:67:be:c3:51:42:2e:2d:6f:c1:0c:
         78:cd:79:90:33:e8:6d:79:6d:ba:f8:c8:d2:6f:47:50:65:29:
         02:21:00:bf:fa:4d:7b:51:83:67:ba:99:c1:ae:eb:6a:c1:9a:
         78:3a:6f:a8:6f:27:db:25:91:90:93:41:7b:f6:a2:85:8d
# 2回目以降は、全く同じコマンドを打ってもエラーが発生する。
OpenSSL> req -text -noout -in localhost.csr
problem creating object tsa_policy1=1.2.3.4.1
27948:error:08064066:object identifier routines:OBJ_create:oid exists:crypto\objects\obj_dat.c:698:
error in req

追記(2020/07/07)

以下のコマンドでも同現象が発生しました。

OpenSSL> req -noout -modulus -in server.csr
Modulus=D33DDA42...31587DC9
OpenSSL> req -noout -modulus -in server.csr
problem creating object tsa_policy1=1.2.3.4.1
10040:error:08064066:object identifier routines:OBJ_create:oid exists:crypto\objects\obj_dat.c:698:
error in req

やはりreqコマンド系で発生するようです。

直し方

本質的な直し方は不明です 笑。

いかがでしたか?(は?)

Ctrl-Cで一旦OpenSSLプロンプトから抜けると、とりあえず直ります。面倒くさいですが、こうする以外に私は方法を見つけれませんでした。

以下の参考URLのissueを追うと、「コマンド実行する際にライブラリコンテクストを作成し、コマンド終了時にそれをクリーンアップするのだけれど、そのクリーンアップがうまく行ってないとかなんとか」みたいに書いてありました。

よくわからないのでバグ修正待ちです。

参考

OpenSSLv1.1.0e CSR verification error, problem creating object tsa_policy1=1.2.3.4.1 · Issue #2795 · openssl/openssl

メールの改行コードはCRLFにしてね

メールの送信できね~~と思ってパケットキャプチャしたら、なんか「See http://pobox.com/~djb/docs/smtplf.html.」と怪しげなURLを見ろというパケットを発見しました。

アクセスしたら、「メールの改行コードはCRLFにしてね」という内容のページでした。

https://cr.yp.to/docs/smtplf.html

そういえばメールの本文の改行コードをLFにしてしまっていたので、CRLFに直したら、無事送信できました。

OpenSSLでメール送信するときのRCPT TOコマンドでのエラーと、記事をキャッシュで読む方法

OpenSSLを使って以下のようにメールを送信しようとしたとき、

> openssl s_client -connect smtp.mail.yahoo.co.jp:465
CONNECTED(000001C0)
...()
read R BLOCK
220 smtpgate606.mail.ssk.ynwp.yahoo.co.jp ESMTP ready
EHLO localhost
250-smtpgate606.mail.ssk.ynwp.yahoo.co.jp
250-PIPELINING
250-8BITMIME
250-SIZE 20480000
250 AUTH PLAIN LOGIN XYMYCONNECT
AUTH PLAIN
334
dGFrZxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxE=
235 ok, go ahead (#2.0.0)
MAIL FROM:<xxxxxxxxxxxxxxxxx@yahoo.co.jp>
250 ok
RCPT TO:<yyyyyyyyyy@yahoo.co.jp>
RENEGOTIATING
5428:error:1420410A:SSL routines:SSL_renegotiate:wrong ssl version:ssl\ssl_lib.c:2127:

というふうに、RCPT TOコマンドを送信するとエラーが発生して切断してしまいます。

エラー原因の詳細は以下の記事が詳しいです。

[Postfix] [OpenSSL] [解決] RENEGOTIATING SSL routines:SSL_renegotiate:wrong ssl version:ssl/ssl_lib.c - noknow

ターミナルでOpenSSL接続中、標準入力の最初の文字が"R"の場合、TLSの再ネゴシエーションとして解釈してしまうようです。

RCPT TOR の文字が原因だそうです。なんざそら。

-quietオプションをつけると解決します。

以下のように正常に動作しました。

> openssl s_client -connect smtp.mail.yahoo.co.jp:465 -quiet
depth=2 C = JP, O = "SECOM Trust Systems CO.,LTD.", OU = Security Communication RootCA2
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=1 C = JP, O = "Cybertrust Japan Co., Ltd.", CN = Cybertrust Japan SureServer CA G4
verify return:1
depth=0 C = JP, ST = Tokyo, L = Chiyoda-ku, O = Yahoo Japan Corporation, CN = smtp.mail.yahoo.co.jp
verify return:1
220 smtpgate607.mail.ssk.ynwp.yahoo.co.jp ESMTP ready
EHLO localhost
250-smtpgate607.mail.ssk.ynwp.yahoo.co.jp
250-PIPELINING
250-8BITMIME
250-SIZE 20480000
250 AUTH PLAIN LOGIN XYMYCONNECT
AUTH PLAIN
334
dGFrZxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxE=
235 ok, go ahead (#2.0.0)
MAIL FROM:<xxxxxxxxxxx@yahoo.co.jp>
250 ok
RCPT TO:<yyyyyyyyyy@yahoo.co.jp>
250 ok
DATA
354 go ahead
Date: Mon, 28 Mar 2005 22:30+40 +0900
From: xxxxxxxxxxx <xxxxxxxxxxx@yahoo.co.jp>
To: yyyyyyyyyy@yahoo.co.jp
Subject: SMTP Test Mail
Message-Id: <20050328223040.1711.yyyyyyyyyy@yahoo.co.jp>
Hello.
This is test mail.
.
250 ok 1591260208 qp 95707
Quit
221 smtp6007.mail.ssk.ynwp.yahoo.co.jp

500エラーの記事を読みたい

どちらかというとこちらが本題です。

エラー内容でググると、記事がヒットするわけです。

f:id:takeg:20200604175454p:plain
検索結果

一番上の記事は、検索クエリの「routines SSL_renegotiate:wrong」という文字列が全て含まれていて、記事のタイトルにも[解決]と書いてあるので、この記事を読めば解決しそうです。

しかし、500 Internal Server Errorで見れない!

で、数十年インターネットしてて初めて知ったんですが、検索結果に出てきた記事をキャッシュで読む機能があるんですね。

f:id:takeg:20200604175753p:plain
キャッシュで読む

画像の矢印マークをクリックしたら「キャッシュ」というのが出てくるので、それをクリックすると記事が読めました。

参考

uPythonのuはマイクロのu

ガッツのGみたいな。

ひょんなことからusslのモジュールを調べていたのですが、usslのuってなんだよって思ってました。

ほかにもusocketとかusslとかujsonとかuPythonとかあります。おそらくですが、ここでのuは「マイクロ(μ)」を意味しています。

μとuが字面が似ているからというのは、なかなか気づきませんでした。

MicroPython、略してuPythonです。

ARC 054: B問題の解説(Python3)

問題:AtCoder Regular Contest 054: B - ムーアの法則

解説

微分して二分法をして解を求める方法と、三分探索をして解を求める方法があります。


問題を要約すると、x年後のコンピュータを使ってT(334)の計算が終わる時間をf(x)としたときの、 f(x) = x + \frac{P}{2^{\frac{x}{1.5}}} の最小値を求めるというもの。


 0 \leq P \leq 10^{18} という制約により、xの値を0から一個ずつ試していくという線形探索は時間がかかりすぎるので駄目っぽいのは気づきます。


 f(x)が下に凸関数ということに気づけば、以下の2つの方法のどちらかで問題を解けます。

【方法1】 f'(x)=0のとき(傾き0のとき) f(x)は最小値をとるので、 f'(x)=0となるようなxを二分探索で探せばよい。

【方法2】下に凸関数なので、 f(x)の最小値を三分探索で求める。


 f(x)が下に凸関数の条件は、「  f''(x)>=0」であること。

詳しくは上に凸,下に凸な関数と二階微分 - 高校数学の美しい物語を参照。

f:id:takeg:20200506073440j:plain

 a^{x}微分は30億年ぶりなので、間違ってるかもしれません。

ソースコード

# -*- coding:utf-8 -*-

def solve():
    """f'(x)=0となるようなxを二分法(二分探索)で求める方法"""
    import math

    P = float(input())

    def f(x):
        # f(x)
        return x + P/(2**(x/1.5))

    def fd(x):
        # f'(x)
        return 1 + P*math.log(2**(-1/1.5)) * (2**(-x/1.5))

    left, right = 0, P
    cnt = 500  # 適当
    while cnt > 0:
        cnt -= 1
        mid = (left+right)/2
        if fd(mid) == 0:
            break
        elif fd(mid) < 0:
            left = mid
            continue
        elif fd(mid) > 0:
            right = mid
            continue

    print(f(mid))


def solve2():
    """三分探索で解く方法"""
    P = float(input())

    def f(x):
        # return x + P/(2**(x/1.5))  # OverflowError: (34, 'Result too large')
        return x + P*(2**(-x/1.5))

    # f(x)は下に凸関数なので、三分探索で解く
    left, right = 0, P
    cnt = 500  # 適当
    ans = float("inf")
    while cnt > 0:
        cnt -= 1

        c1, c2 = (2*left+right)/3, (left+2*right)/3
        ret1, ret2 = f(c1), f(c2)

        if ret1 > ret2:
            left = c1
            ans = min(ans, ret2)
            continue
        else:
            right = c2
            ans = min(ans, ret1)
            continue

    print(ans)


if __name__ == "__main__":
    solve2()

注意なのですが、上の、

    def f(x):
        # return x + P/(2**(x/1.5))  # OverflowError: (34, 'Result too large')
        return x + P*(2**(-x/1.5))

の部分の書き方によって、OverflowError: (34, 'Result too large')のエラーが発生してしまいます。

3.0000
Traceback (most recent call last):
  File "c:/Users/XXXX/YYYY/022.py", line 32, in <module>
  File "c:/Users/XXXX/YYYY/022.py", line 17, in solve
    ret1, ret2 = f(c1), f(c2)
  File "c:/Users/XXXX/YYYY/022.py", line 7, in f
    return x + P/(2**(x/1.5))
OverflowError: (34, 'Result too large')

xが10000程度でも、途中計算の(2**(x/1.5))の値が大きすぎてオーバーフローして上記のようなエラーが発生します。

これを(2**(-x/1.5))と書き換えることで、途中計算でオーバーフローの発生を防げます。

計算式をプログラミングするときは、書き方に意識しましょうという問題で学びがありました。

参考

pythonnetのclrのインストールと使い方

pythonnetパッケージとは、Python for .NETと呼ばれるもので、.NETのCommon Language Runtime(CLR)をPythonで扱えるようになるパッケージです。

といってもあまりよくわかってないのですが、とにかくこのpythonnetのclrモジュールを使うことで、Pythonプログラムの中でdllファイルを読み込んで、そのdllモジュールを使うことができます。

github.com

pythonnetのインストール

Installation · pythonnet/pythonnet Wiki · GitHub

Anacondaだとまたインストールの方法が違うようです。詳しくは上記の公式Wikiを見てください。

Python3.8.xだとPythonの3.8.0のバグにより、インストールに失敗します。(2020/03/23現在)

pythonnetの公式には3.8.1で修正される予定みたいなこと書いてありますが、3.8.1でも以下のようなエラーが出てしまいます。

(venv) > pip install pythonnet
    Collecting pythonnet
      Using cached pythonnet-2.4.0.tar.gz (1.8 MB)
    Building wheels for collected packages: pythonnet
      Building wheel for pythonnet (setup.py) ... error
      ERROR: Command errored out with exit status 1:
        command: 'c:\users\XXXX\workspace\clr_test\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\XXXX\\AppData\\Local\\Temp\\pip-install-co_4hlm1\\pythonnet\\setup.py'"'"'; __file__='"'"'C:\\Users\\XXXX\\AppData\\Local\\Temp\\pip-install-co_4hlm1\\pythonnet\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d 'C:\Users\XXXX\AppData\Local\Temp\pip-wheel-j0v3wdk9'
            cwd: C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\
      Complete output (70 lines):
      running bdist_wheel
      running build
      running build_ext
      https://www.nuget.org/api/v2/ の更新を確認しています。
      NuGet.exe 4.1.0 は実行中です。
      NuGet.exe を 5.4.0 に更新しています。
      正常に更新されました。
      MSBuild auto-detection: using msbuild version '14.0' from 'C:\Program Files (x86)\MSBuild\14.0\bin\amd64'.
      Restoring NuGet package NUnit.3.7.1.
      Restoring NuGet package UnmanagedExports.1.2.7.
      Restoring NuGet package NUnit.ConsoleRunner.3.7.0.
      Adding package 'NUnit.ConsoleRunner.3.7.0' to folder 'C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\packages'
      Adding package 'UnmanagedExports.1.2.7' to folder 'C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\packages'
      Adding package 'NUnit.3.7.1' to folder 'C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\packages'
      Added package 'UnmanagedExports.1.2.7' to folder 'C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\packages'
      Added package 'NUnit.ConsoleRunner.3.7.0' to folder 'C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\packages'
      Added package 'NUnit.3.7.1' to folder 'C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\packages'

      NuGet Config files used:
          C:\Users\XXXX\AppData\Roaming\NuGet\NuGet.Config
          C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config

      Feeds used:
          C:\Users\XXXX\.nuget\packages\
          https://api.nuget.org/v3/index.json
          C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\

      Installed:
          3 package(s) to packages.config projects
      Traceback (most recent call last):
        File "tools\geninterop\geninterop.py", line 24, in <module>
          from pycparser import c_ast, c_parser
      ModuleNotFoundError: No module named 'pycparser'
      Traceback (most recent call last):
        File "<string>", line 1, in <module>
        File "C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\setup.py", line 623, in <module>
          setup(
        File "c:\users\XXXX\workspace\clr_test\venv\lib\site-packages\setuptools\__init__.py", line 145, in setup
          return distutils.core.setup(**attrs)
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\core.py", line 148, in setup
          dist.run_commands()
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\dist.py", line 966, in run_commands
          self.run_command(cmd)
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\dist.py", line 985, in run_command
          cmd_obj.run()
        File "C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\setup.py", line 610, in run
          return bdist_wheel.bdist_wheel.run(self)
        File "c:\users\XXXX\workspace\clr_test\venv\lib\site-packages\wheel\bdist_wheel.py", line 223, in run
          self.run_command('build')
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\cmd.py", line 313, in run_command
          self.distribution.run_command(command)
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\dist.py", line 985, in run_command
          cmd_obj.run()
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\command\build.py", line 135, in run
          self.run_command(cmd_name)
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\cmd.py", line 313, in run_command
          self.distribution.run_command(command)
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\dist.py", line 985, in run_command
          cmd_obj.run()
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\command\build_ext.py", line 340, in run
          self.build_extensions()
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\command\build_ext.py", line 449, in build_extensions
          self._build_extensions_serial()
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\distutils\command\build_ext.py", line 474, in _build_extensions_serial
          self.build_extension(ext)
        File "C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\setup.py", line 298, in build_extension
          subprocess.check_call([sys.executable, geninterop, interop_file])
        File "C:\Users\XXXX\AppData\Local\Programs\Python\Python38-32\lib\subprocess.py", line 364, in check_call
          raise CalledProcessError(retcode, cmd)
      subprocess.CalledProcessError: Command '['c:\\users\\XXXX\\workspace\\clr_test\\venv\\scripts\\python.exe', 'tools\\geninterop\\geninterop.py', 'src\\runtime\\interop38.cs']' returned non-zero exit status
    1.
      ----------------------------------------
      ERROR: Failed building wheel for pythonnet
      Running setup.py clean for pythonnet
    Failed to build pythonnet
    Installing collected packages: pythonnet
        Running setup.py install for pythonnet ... error
        ERROR: Command errored out with exit status 1:
          command: 'c:\users\XXXX\workspace\clr_test\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\XXXX\\AppData\\Local\\Temp\\pip-install-co_4hlm1\\pythonnet\\setup.py'"'"'; __file__='"'"'C:\\Users\\XXXX\\AppData\\Local\\Temp\\pip-install-co_4hlm1\\pythonnet\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\XXXX\AppData\Local\Temp\pip-record-avnq3p6k\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\XXXX\workspace\clr_test\venv\include\site\python3.8\pythonnet'
              cwd: C:\Users\XXXX\AppData\Local\Temp\pip-install-co_4hlm1\pythonnet\
        Complete output (6 lines):
        usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
            or: setup.py --help [cmd1 cmd2 ...]
            or: setup.py --help-commands
            or: setup.py cmd --help

        error: option --single-version-externally-managed not recognized
        ----------------------------------------
    ERROR: Command errored out with exit status 1: 'c:\users\XXXX\workspace\clr_test\venv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\XXXX\\AppData\\Local\\Temp\\pip-install-co_4hlm1\\pythonnet\\setup.py'"'"'; __file__='"'"'C:\\Users\\XXXX\\AppData\\Local\\Temp\\pip-install-co_4hlm1\\pythonnet\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\XXXX\AppData\Local\Temp\pip-record-avnq3p6k\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\users\XXXX\workspace\clr_test\venv\include\site\python3.8\pythonnet' Check the logs for full command output.

python3.7以下だとインストールできます。(以下の方法はグローバルインストールするので、アンインストールしたければpy -3.7 -m pip uninstall pythonnetをすること)

(venv) PS C:\Users\XXXX\workspace\clr_test> py -3.7 -m pip install pythonnet
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
Collecting pythonnet
  Downloading https://files.pythonhosted.org/packages/65/ed/cd200e95392d7f4a74319ff9166ba8a4a6fb28a405b065297f3fdec82da9/pythonnet-2.4.0-cp37-cp37m-win_amd64.whl (70kB)
      |████████████████████████████████| 71kB 1.5MB/s 
Installing collected packages: pythonnet
Successfully installed pythonnet-2.4.0

グローバルインストールされてるので、アンインストールしたければ以下のようにアンインストールします。

# インストールの確認
PS C:\Users\XXXX\workspace\hoge> py -3.7 -m pip freeze
pythonnet==2.4.0
# アンインストール
PS C:\Users\XXXX\workspace\hoge> py -3.7 -m pip uninstall pythonnet
Uninstalling pythonnet-2.4.0:
  Would remove:
    c:\users\XXXX\appdata\local\programs\python\python37\lib\site-packages\clr.pyd
    c:\users\XXXX\appdata\local\programs\python\python37\lib\site-packages\python.runtime.dll
    c:\users\XXXX\appdata\local\programs\python\python37\lib\site-packages\pythonnet-2.4.0.dist-info\*
Proceed (y/n)? y
  Successfully uninstalled pythonnet-2.4.0
# 再度確認
PS C:\Users\XXXX\workspace\hoge> py -3.7 -m pip freeze
PS C:\Users\XXXX\workspace\hoge>

clrモジュールの使い方

さて、pythonnetがインストールされていれば、clrモジュールを使うことができます。

>>> import clr
>>> dir(clr)
['AddReference', 'FindAssembly', 'GetClrType', 'ListAssemblies', 'Microsoft', 'Python', 'System', '_AtExit', '__class__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__version__', '_extras', 'clrModule', 'clrmethod', 'clrproperty', 'e__NativeCall', 'getPreload', 'setPreload']

いろんなサイトを巡回してみると、AddReferenceToFileAndPathを使ってるサイトがありますが、AddReferenceでOK。

import clr
clr.AddReference(r"...\Redist\SolidWorks.Interop.swconst.dll")
from SolidWorks.Interop import swconst
    
print(swconst.swDisplayStateOpts_e.swAllDisplayState)
# 2

stackoverflow.com

clr違い

>>> import clr
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'clr'

上記のエラーを見て、ついpip install clrをしてしまうと、違うclrモジュールをインストールしてしまうので注意が必要です。

pypi.org

(venv) PS C:\Users\XXXX\workspace\clr_test> pip install clr
Collecting clr
  Using cached clr-1.0.3-py2.py3-none-any.whl (4.4 kB)
Installing collected packages: clr
Successfully installed clr-1.0.3
(venv) PS C:\Users\XXXX\workspace\clr_test> py
Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> dir(clr)
['StyleBuilder', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__module__', '__name__', '__package__', '__path__', '__spec__', '_styles', 'black', 'blue', 'bold', 'cyan', 'dim', 'green', 'hidden', 'inverse', 'italic', 'key', 'light_black', 'light_blue', 'light_cyan', 'light_green', 'light_magenta', 'light_red', 'light_white', 'light_yellow', 'magenta', 'on_black', 'on_blue', 'on_cyan', 'on_green', 'on_light_black', 'on_light_blue', 'on_light_cyan', 'on_light_green', 'on_light_magenta', 'on_light_red', 'on_light_white', 'on_light_yellow', 'on_magenta', 'on_red', 'on_white', 'on_yellow', 'red', 'strikethrough', 'style_builder', 'sys', 'underline', 'value', 'white', 'yellow']

参考