基本的に、次のようなpythonファイルがある場合:
python-code.py
そして使用:
import (python-code)
インタープリターは構文エラーを出します。
それを修正する方法についてのアイデアはありますか?Pythonファイル名でダッシュは違法ですか?
Python コードのスタイル ガイドであるPEP 8を確認してください。
パッケージとモジュールの名前 モジュールには、すべて小文字の短い名前を付ける必要があります。読みやすくする場合は、モジュール名にアンダースコアを使用できます。アンダースコアの使用はお勧めできませんが、Python パッケージの名前もすべて小文字で短くする必要があります。
モジュール名はファイル名にマップされ、一部のファイル システムでは大文字と小文字が区別されず、長い名前は切り捨てられるため、モジュール名をかなり短く選択することが重要です。これは Unix では問題になりませんが、コードが古い Mac や Windows のバージョン、または DOS に移植されたときの問題。
つまり、ファイルの名前を変更してください:)
コードで注意すべきもう 1 つの点は、 import が関数ではないことです。すでに述べたように、意図したものではなく、「pythonマイナスコードをインポート」と解釈されるimport(python-code)
はずです。import python-code
名前にダッシュが含まれるファイルをインポートする必要がある場合は、次の手順を実行できます。
python_code = __import__('python-code')
ただし、前述のとおり、これはあまりお勧めできません。あなたが制御するものである場合は、ファイル名を変更する必要があります。
TLDR
ダッシュは違法ではありませんが、次の 3 つの理由から使用しないでください。
絶対にダッシュを含むファイル名をインポートする必要がある場合、特別な構文は次のとおりです。
module_name = __import__('module-name')
特別な構文が必要な理由に興味がありますか?
特別な構文の理由は、あなたが書くときimport somename
、識別子を持つモジュールオブジェクトを作成しているsomename
ためです(後でそれを eg で使用できますsomename.funcname
)。もちろんmodule-name
、有効な識別子ではないため、有効な識別子を与える特別な構文です。
module-name が有効な識別子ではない理由がわかりませんか?
心配しないでください - 私もしませんでした。ここに役立つヒントがあります: この python 行を見てください: x=var1-var2
. 割り当ての右側に減算があるか、またはダッシュ付きの変数名が表示されますか?
PS
他のすべての回答から最も関連性の高い情報と思われるものを1か所に含めることを除いて、私の回答には独創的なものは何もありません
問題は、それpython-code
が識別子ではないことです。python
パーサーはこれをマイナスと見なしcode
ます。もちろん、これはあなたが求めていることをしません。有効な Python 識別子でもあるファイル名を使用する必要があります。をアンダースコアに置き換えてみてください-
。
ハックしてインポートすることもでき__import__
ますが、方法がわからない場合は、インポートしないでください。Python モジュール名は有効な変数名 (「識別子」) である必要があります。つまり、モジュールがある場合は、foo_bar
Python ( ) 内から使用できますprint foo_bar
。変な名前ではできません ( print foo-bar
-> 構文エラー)。
適切なファイル名を付けることが最善の方法ですが、私たちの管理下にない場合は、他の作成者のコードをコピーしたり、名前を変更したり、いじったりするよりもpython-code
、ハックを使用する方が良いでしょう。__import__
ただし、拡張子を追加してファイルの名前を変更しない限り、機能しませんでした.py
。ドキュメントを見て 、 の説明を取得する方法を導き出した後、次のようになりました.py
。
import imp
try:
python_code_file = open("python-code")
python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
python_code_file.close()
最初の実行時に新しいファイルpython-codec
を作成しました。