none
pythonネイティブ開発プロジェクトの作成失敗 RRS feed

  • 質問

  • ファイル->新規作成->プロジェクト->python拡張モジュール->OK

    の順にクリックしていき実行するとエラーメッセージ

    ---------------------------
    Microsoft Visual Studio
    ---------------------------
    プロジェクト ファイル "module1.vcxproj" を読み取れません。

    C:\Users\user-01\source\repos\module1\module1\module1.vcxproj(71,5): 式 "[System.IO.Path]::GetDirectoryName('')" を評価できません。パスの形式が無効です。
    ---------------------------
    OK   
    ---------------------------

    と共に失敗します。

    ・visual studioの再インストール

    ・pythonの再インストール

    ・別ユーザーでの実行

    ・別マシンでのインストール及び実行(VSインストーラからpython3 64bitをインストール)

    ・プロジェクト作成パスの変更

    ・既定python環境の変更

    ・設定のインポートとエクスポートからの設定のリセット

    ・既存のソリューションへのプロジェクトの追加での作成

    どれを行っても同様のエラーで失敗します。

    別マシンでもこうとなるとこのエラーは何が原因なのでしょうか?


    2017年10月3日 12:44

回答

  • プロジェクトテンプレートが Python 32bit が存在する前提で作られているからです。
    そのプロジェクトテンプレートを利用したいのであれば、Python の 32bit バージョンも Visual Studio Installer からインストールしてください。
    なお、プロジェクト作成後は、構成を x64 に切り替えることで、Python 64bit をベースとした開発に切り替えられます。

    あるいは、このプロジェクトテンプレートに頼らないか。
    https://docs.microsoft.com/ja-jp/visualstudio/python/cpp-and-python#create-the-core-c-project

    -----

    原因は vcxproj を読み解くと見えてきます。
    エラーの行には $([System.IO.Path]::GetDirectoryName($(PythonExe))) と書いてあります。
    PythonExe は 61-63 行目で示されるレジストリから取得するようですが、そのレジストリのパスに PythonTag が出てきます。
    PythonTag はデフォルトで 57 行目の PythonVersion と "-32" を連結した方を使うように書かれているので、32bit の Python のインストールパスがないと失敗します。

    2017年10月3日 13:46
    モデレータ
  • Visual Studio Installer でなくても、Python 3.6.x (32bit) が別途インストールされていれば問題なく動きます。
    (それが、Python3 を直接インストールであれ、何かと一緒に入った間接インストールであれ、レジストリ(HKCU or HKLM)からインストールパスの文字列が得られれば良い)

    手元で、Visual Studio Installer を使って 32bit 版を削除して失敗する動作を確認した後、Python のサイトから 3.6.2 の Installer をダウンロードしてインストールすることで成功する状態に戻ることを確認しています。
    この場合、Visual Studio Installer で 32bit 版にチェックはつきません。


    よって、うまくいく環境は何らかのきっかけによって、32bit 版 Python が存在するか、少なくともレジストリ HKCU or HKLM\Software\Python\PythonCore\3.6-32\InstallPath に ExecutablePath が存在するはずです。
    (プロジェクトテンプレートは動的生成ではなく、固定のファイルのようなので、環境によって生成されるものが異なるという可能性もなさそうです)
    2017年10月4日 14:35
    モデレータ

すべての返信

  • プロジェクトテンプレートが Python 32bit が存在する前提で作られているからです。
    そのプロジェクトテンプレートを利用したいのであれば、Python の 32bit バージョンも Visual Studio Installer からインストールしてください。
    なお、プロジェクト作成後は、構成を x64 に切り替えることで、Python 64bit をベースとした開発に切り替えられます。

    あるいは、このプロジェクトテンプレートに頼らないか。
    https://docs.microsoft.com/ja-jp/visualstudio/python/cpp-and-python#create-the-core-c-project

    -----

    原因は vcxproj を読み解くと見えてきます。
    エラーの行には $([System.IO.Path]::GetDirectoryName($(PythonExe))) と書いてあります。
    PythonExe は 61-63 行目で示されるレジストリから取得するようですが、そのレジストリのパスに PythonTag が出てきます。
    PythonTag はデフォルトで 57 行目の PythonVersion と "-32" を連結した方を使うように書かれているので、32bit の Python のインストールパスがないと失敗します。

    2017年10月3日 13:46
    モデレータ
  • ご回答を元に32bit版をVSインストーラよりインストールしプロジェクトの作成を試みましたところ成功致しました。

    正確、詳細な回答をしていただき誠にありがとうございます。

    とても助かりました!

    2017年10月4日 9:01
  • 環境が違うのかも知れませんが、 64bit版で問題無く、動いています。

    > Visual stdio 2017 Comminuty

    正確には、こちらの質問で、初めてプロジェクトを作ってみたのですが。

    ただ、問題があって、 Anaconda3を後から、追加したのですが、認識してくれません。
    コマンドプロンプトで使って、しばらく悩み、その結果、 Python3 としてインストールしたものと、Anaconda3でインストールしたものが別と気が付きました。

    コマンドプロンプトから、 py で実行されるのは、 Python3 であり、Anaconda3ではないと。

    Anaconda3は、"C:\Program Files\Anaconda3" にパスを通せば、 OKでした。

    で、"import numpy" でエラーが無くなりました。
    (anaconda3 では、py では動かず、 python とする必要がありました)
    Visual stdio 2017 も同様で、 こちらの環境では、 "import numpy" がエラーとなっています。

    参考までに。


    • 編集済み pepperleaf01 2017年10月5日 14:17 誤字訂正
    2017年10月4日 14:16
  • Visual Studio Installer でなくても、Python 3.6.x (32bit) が別途インストールされていれば問題なく動きます。
    (それが、Python3 を直接インストールであれ、何かと一緒に入った間接インストールであれ、レジストリ(HKCU or HKLM)からインストールパスの文字列が得られれば良い)

    手元で、Visual Studio Installer を使って 32bit 版を削除して失敗する動作を確認した後、Python のサイトから 3.6.2 の Installer をダウンロードしてインストールすることで成功する状態に戻ることを確認しています。
    この場合、Visual Studio Installer で 32bit 版にチェックはつきません。


    よって、うまくいく環境は何らかのきっかけによって、32bit 版 Python が存在するか、少なくともレジストリ HKCU or HKLM\Software\Python\PythonCore\3.6-32\InstallPath に ExecutablePath が存在するはずです。
    (プロジェクトテンプレートは動的生成ではなく、固定のファイルのようなので、環境によって生成されるものが異なるという可能性もなさそうです)
    2017年10月4日 14:35
    モデレータ
  • 確認しましたが、32bit版はなさそうです。

    HKCU --> HKEY_CURRENT_USER でしょうか? こちらには Python の項目そのものがありませんでした。


    見落としあるでしようか?

    Visual Studio のバージョンは以下の通りです。

    環境の違いとすれば、それまでですが、参考までに。

    Anaconda3が使えないのも問題ですが、もう少し調べてみようと思っています。(コマンドプロンプトでは解決したので)

    2017年10月5日 14:25
  • HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Python\PythonCore\ もありませんか?

    だとすれば、環境変数に PythonHome, PythonExe, PythonDExe のいずれかに値が設定されているのでは?

    プロジェクトを作成されているのであれば、vcxproj をテキストエディタなどで閲覧すると以下の内容を確認できるはずです。

        <RegistryView>RegistryView.Registry32</RegistryView>
        <RegistryView Condition="$(Platform) == 'x64'">RegistryView.Registry64</RegistryView>
        <PythonTag>$(PythonVersion)-32</PythonTag>
        <PythonTag Condition="$(Platform) == 'x64'">$(PythonVersion)</PythonTag>
        <PythonHome Condition="$(PythonHome) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', null, null, $(RegistryView)))</PythonHome>
        <PythonHome Condition="$(PythonHome) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', null, null, $(RegistryView)))</PythonHome>
        <PythonExe Condition="$(PythonExe) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', 'ExecutablePath', null, $(RegistryView)))</PythonExe>
        <PythonExe Condition="$(PythonExe) == ''">$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\$(PythonTag)\InstallPath', 'ExecutablePath', null, $(RegistryView)))</PythonExe>
        <PythonExe Condition="$(PythonExe) == '' and $(PythonHome) != ''">$(PythonHome)python.exe</PythonExe>
    (略)
    <PythonDExe Condition="$(PythonDExe) == ''">$([System.IO.Path]::GetDirectoryName($(PythonExe)))\python$(PythonDebugSuffix).exe</PythonDExe> <PythonDExe Condition="!Exists($(PythonDExe))">$(PythonExe)</PythonDExe>

    PythonExe がその時点で定義されていなければ、レジストリから取得しますし、PythonDExe がその時点で定義されていなければ、PythonExe を System.IO.Path.GetDirectoryName に渡すので、パスと解釈できる文字列を得られていなければプロジェクトファイルでの解釈でエラーになるように作られています。

    WOW6432Node のレジストリにもない場合は、おそらく、環境変数か、その環境の MSBuild のどこかに何らかの PythonHome, PythonExe, PythonDExe のいずれかの定義があるのではないでしょうか。

    -----

    検証した結果から言えることは、Python 3 (32bit) を入れるか、環境変数 PythonHome に何らかのパスを設定するかです。
    ただ、環境変数 PythonHome に入れてしまうと、Win32 / x64 の構成切り替え→デバッグ開始がうまくいかなくなるので、自分でデバッグ実行時に起動する exe のパスをプロジェクトごとに設定する必要があります。

    Python 拡張モジュールを汎用的かつ、x86/x64 両方で作りたい場合は、環境変数 PythonHome を設定しない方がお手軽だとは思います。

    2017年10月5日 15:06
    モデレータ
  • WOW6432 を確認しましたが、下記のようでした。

    PyLauncher が関係しそうな気もしましたが、Pythonそのものはありません。

    プロジェクトは、 PythonApp1.pyproj が作られていました。 (vcxproj ではありません)
    関係しそうな行と言うと、

      <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets" />

    くらいでしょうか。

    環境変数については、PY で始まるものはありませんでした。
    (もし、あれば、anconda3の問題が解決すると期待したのですが、、、)

    以上、報告まで。

    2017年10月7日 8:29
  • 質問者は言語を明示していなかったからかもしれませんが、当スレッドは C++ の下にある、「Python 拡張モジュール」で作る場合の話をしています。
    (Python 言語ツリーに「Python 拡張モジュール」はありません)

    質問者のエラーメッセージも「プロジェクト ファイル "module1.vcxproj" を読み取れません」とあるように、Visual C++ プロジェクトであることがうかがえます。
    pepperleaf01 さんの示すプロジェクトファイル名や拡張子は当スレッドとは関係のない、Python アプリケーションプロジェクトなど、Python 言語カテゴリの話をされているのではないでしょうか?

    (Anaconda の話は当スレッドとまったく関係ないので、必要なら別スレッドを立ててください)
    2017年10月7日 9:29
    モデレータ
  • > 質問者のエラーメッセージも「プロジェクト ファイル "module1.vcxproj" を読み取れません」とあるように、Visual C++ プロジェクトであることがうかがえます。

    VC++プロジェクトの話という事だったのですね。失礼しました。

    Anaconda3の件は、Azuleanさんの指摘で解決できると期待しただけです。(どうも無理そうですが)
    前のコメントに書いたように、もう少し調べてから、別スレッドにするつもりです。
    (コマンドプロンプトで使えているので質問も先になると思いますが)

    インストールしたのに使えない、、という質問に対し、私のところでは使えていたので、なぜ、というのが最初のコメントの主旨です。前提が違っていたようでした。

    -----------------------
    追記 11/19

    Anaconda3 の件は、以下の方法で対応可能でした。

     ツール(T) - Python(P) - Python環境(E)

    とすると、Python環境設定画面が表示されるので、そこで Anaconda 4.4.0を選択する事で、利用可能となりました。  参考までに

    • 編集済み pepperleaf01 2017年11月19日 14:38 不明点が分かったので参考情報追加
    2017年10月7日 15:25