回答:
PythonコードのスタイルガイドであるPEP 8を確認してください。
パッケージとモジュールの名前モジュールは、すべて小文字の短い名前にする必要があります。読みやすさを向上させる場合は、モジュール名にアンダースコアを使用できます。Pythonパッケージも、すべて小文字の短い名前にする必要がありますが、アンダースコアの使用はお勧めしません。
モジュール名はファイル名にマッピングされ、一部のファイルシステムでは大文字と小文字が区別されず、長い名前が切り捨てられるため、モジュール名はかなり短くなるように選択することが重要です-これはUnixでは問題になりませんが、コードが古いバージョンのMacまたはWindows、またはDOSに転送された場合の問題。
つまり、ファイルの名前を変更します:)
ops-scripts
と、通常のパッケージ名前空間アプローチを使用してインポートできないことがわかります。または、stop-website.py
同様の効果を得るために単一のスクリプトに名前を付けることもできます。runpy
もちろん、これらはいずれもや他のいくつかの方法でインポートできますが、これはいくつかの一般的なエラーを回避するのに役立ちます。
cgi-bin
フォルダ内のpython cgiファイルを使用しています(それらに対してunitttestを実行しています)。これはかなり標準的なafaikです。このようなまれなケースがない限り、それを制御できる場合は必ずモジュールの名前を変更してください。
コードで注意すべきもう1つの点は、インポートは関数ではないということです。そのimport(python-code)
ためimport python-code
、既に言及したように、意図したものではなく、「Pythonマイナスコードのインポート」として解釈される必要があります。名前にダッシュが含まれているファイルをインポートする必要がある場合は、次のようにします。
python_code = __import__('python-code')
ただし、これも前述のとおり、これはあまりお勧めできません。ファイル名を自分で制御する場合は、変更する必要があります。
TLDR
ダッシュは違法ではありませんが、3つの理由で使用しないでください。
ダッシュを含むファイル名をインポートする必要がある場合、特別な構文は次のとおりです。
module_name = __import__('module-name')
なぜ特別な構文が必要なのか知りたいですか?
特別な構文の理由は、あなたが書くときにimport somename
識別子を持つモジュールオブジェクトを作成しているsomename
ためです(そのため、たとえばでそれを使用できますsomename.funcname
)。もちろんmodule-name
、これは有効な識別子ではないため、有効な識別子を提供する特別な構文です。
module-nameが有効な識別子ではない理由がわかりませんか?
心配しないで-私もしませんでした。ここにあなたを助けるためのヒントがあります:このpython行を見てください:x=var1-var2
。割り当ての右側に減算が表示されますか、ダッシュ付きの変数名が表示されますか?
PS
1つの場所で他のすべての回答からの最も関連性の高い情報のビットであると私が考えたものを含めることを除いて、私の回答にはオリジナルはありません
psycopg2_binary = import_module('psycopg2-binary')
。エラー=> ModuleNotFoundError: No module named 'psycopg2-binary'
。しかしpsycopg2-binary
インストールされています。それをどのように含めるかはわかりません。
問題は、それpython-code
が識別子ではないことです。パーサーはこれをpython
マイナスと見なしcode
ます。もちろん、これはあなたが望んでいることをしません。有効なPython識別子でもあるファイル名を使用する必要があります。を-
アンダースコアに置き換えてみてください。
Python 3ではimport_moduleを使用します。
from importlib import import_module
python_code = import_module('python-code')
より一般的には、
import_module('package.subpackage.module')
適切なファイルの名前付けが最良のコースです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
最初の実行時に新しいファイルが作成されました。