それらをインポートしようとするときにPythonファイルでダッシュを使用しても大丈夫ですか?


149

基本的に私が次のようなPythonファイルを持っているとき:

python-code.py

そして使用:

import (python-code)

インタプリタは私に構文エラーを与えます。

それを修正する方法に関するアイデアはありますか?Pythonファイル名にダッシュは違法ですか?

回答:


167

PythonコードのスタイルガイドであるPEP 8を確認してください。

パッケージとモジュールの名前モジュールは、すべて小文字の短い名前にする必要があります。読みやすさを向上させる場合は、モジュール名にアンダースコアを使用できます。Pythonパッケージも、すべて小文字の短い名前にする必要がありますが、アンダースコアの使用はお勧めしません。

モジュール名はファイル名にマッピングされ、一部のファイルシステムでは大文字と小文字が区別されず、長い名前が切り捨てられるため、モジュール名はかなり短くなるように選択することが重要です-これはUnixでは問題になりませんが、コードが古いバージョンのMacまたはWindows、またはDOSに転送された場合の問題。

つまり、ファイルの名前を変更します:)


75
問題スタイルとは何の関係もありません、それはだ、構文 エラー

4
以下に示すように、この名前のファイルがまだ存在する可能性があるため、スタイルガイドは非常に重要です。
Paolo Bergantino 2012年

5
明示的にインポートを禁止したい場合は、Pythonディレクトリとファイル名にハイフンを使用すると非常に役立ちます。たとえば(たとえば)Djangoプロジェクトでは、Pythonで記述されたスクリプトをアプリケーションとしてアドレス指定できないようにする必要があります。これらをのようなフォルダーに置くops-scriptsと、通常のパッケージ名前空間アプローチを使用してインポートできないことがわかります。または、stop-website.py同様の効果を得るために単一のスクリプトに名前を付けることもできます。runpyもちろん、これらはいずれもや他のいくつかの方法でインポートできますが、これはいくつかの一般的なエラーを回避するのに役立ちます。
クリスジョンソン

モジュールの名前を変更すると、特に別の標準に依存している場合に問題が発生する可能性があります。私の場合、cgi-binフォルダ内のpython cgiファイルを使用しています(それらに対してunitttestを実行しています)。これはかなり標準的なafaikです。このようなまれなケースがない限り、それを制御できる場合は必ずモジュールの名前を変更してください。
NuclearPeon 2014

1
PyDevがハイフンを含むディレクトリ名を許可することを発見しましたが、そのディレクトリに含まれる.pyファイルのクラスや内部変数は表示されません。
user5920660 2017

122

コードで注意すべきもう1つの点は、インポートは関数ではないということです。そのimport(python-code)ためimport python-code、既に言及したように、意図したものではなく、「Pythonマイナスコードのインポート」として解釈される必要があります。名前にダッシュが含まれているファイルをインポートする必要がある場合は、次のようにします。

python_code = __import__('python-code')

ただし、これも前述のとおり、これはあまりお勧めできません。ファイル名を自分で制御する場合は、変更する必要があります。


@KevinAudlemanハイフネーションされたファイルでインポートライブラリを使用する実例はありますか?私は試しましたが失敗しました。
トム・ヘイル

@TomHale importlib.import_module( 'abmodule-1')が機能するはずです。import_moduleが機能しない場合、通常のインポートも機能しないと思います。
Ian Lin、

63

TLDR

ダッシュは違法ではありませんが、3つの理由で使用しないでください。

  1. ダッシュを含むファイルをインポートするには特別な構文が必要です
  2. ダッシュ付きのモジュール名を期待する人はいません
  3. Pythonスタイルガイドの推奨事項に違反している

ダッシュを含むファイル名をインポートする必要がある場合、特別な構文は次のとおりです。

module_name = __import__('module-name')

なぜ特別な構文が必要なのか知りたいですか?

特別な構文の理由は、あなたが書くときにimport somename識別子を持つモジュールオブジェクトを作成しているsomenameためです(そのため、たとえばでそれを使用できますsomename.funcname)。もちろんmodule-name、これは有効な識別子ではないため、有効な識別子を提供する特別な構文です。

module-nameが有効な識別子ではない理由がわかりませんか?

心配しないで-私もしませんでした。ここにあなたを助けるためのヒントがあります:このpython行を見てください:x=var1-var2。割り当ての右側に減算が表示されますか、ダッシュ付きの変数名が表示されますか?

PS

1つの場所で他のすべての回答からの最も関連性の高い情報のビットであると私が考えたものを含めることを除いて、私の回答にはオリジナルはありません


ハイフンを含むこのインポートpipパッケージを使用しようとしています。psycopg2_binary = import_module('psycopg2-binary')。エラー=> ModuleNotFoundError: No module named 'psycopg2-binary'。しかしpsycopg2-binaryインストールされています。それをどのように含めるかはわかりません。
Mote Zart

多分それは道の問題です。chrisyeh96.github.io/2017/08/08/…を
ndemou

32

問題は、それpython-codeが識別子ではないことです。パーサーはこれをpythonマイナスと見なしcodeます。もちろん、これはあなたが望んでいることをしません。有効なPython識別子でもあるファイル名を使用する必要があります。を-アンダースコアに置き換えてみてください。


4
+1。Pythonソースコードのファイル名が有効な識別子である必要があるとは決して思っていません。ファイル名がモジュールオブジェクトの参照に使用されるためです。
アンディ2015

5

おそらくいくつかの__import__ハックでインポートできますが、方法がわからない場合はインポートしないでください。Pythonモジュール名は有効な変数名(「識別子」)である必要があります。つまり、モジュールがある場合は、foo_barPython(print foo_bar)内から使用できます。奇妙な名前(print foo-bar->構文エラー)を使用してこれを行うことはできません。


5

Python 3ではimport_moduleを使用します

from importlib import import_module
python_code = import_module('python-code')

より一般的には、

import_module('package.subpackage.module')

1

適切なファイルの名前付けが最良のコースです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最初の実行時に新しいファイルが作成されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.