Pythonでは、ファイル名をインポートする方法は数字で始まります


84

基本的にというファイルがあり、8puzzle.pyそのファイルを別のファイルにインポートしたい(同じフォルダー内にあり、ファイルが提供されているためファイル名を変更できません)。Pythonでこれを行う方法はありますか?通常の方法from 8puzzle import *で試しましたが、エラーが発生します。

エラーは次のとおりです。

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 

12
なぜ人々は「それは私にエラーを与える」と言って、それからエラーが何であるかを投稿しないのですか?
John Zwinck 2012

7
@JohnZwinck構文エラーです。「8puzzle」は有効な識別子ではなく(数字で始まる)、importステートメントの構文ではPython識別子が必要であるためだと思います。「いいえ、できません。モジュールの名前を文字またはアンダースコアで始まる名前に変更してください。」という答えになります。
ミリムース2012

ジョンは良い点を述べました、私は心に留めておきます。そして、Abhijeetに感謝します。エラーメッセージを追加してください。ありがとう。
Simon Guo

1
名前8puzzle.pyを変更puzzle8.pyして使用しますimport puzzle8
バクリウ2016

回答:


96

あなたができる

puzzle = __import__('8puzzle')

非常に興味深い問題。番号で名前を付けないことを覚えています。

あなたがしたい場合import *-あなたはすべきこの質問と答えをチェックしてください


1
よく働く!ありがとう。ええ、番号で始まる名前は付けませんが、コース課題の配布ファイルなので、名前を変更することはできません。しかし、私たちはすでにそれに対する解決策を得ているので、それは問題ではないようです。再度、感謝します。
Simon Guo

4
世界、または少なくともあなたのクラスメートを救うのを手伝ってください。不可能な輸入品を手渡された場合は、インストラクターの注意を引いてください。ええ、時々彼らは間違っているのを嫌います、しかしあなたがこの問題を抱えているなら、他のみんなもそうです、そしてこの答えはうまくいきますが、それは正しい解決策ではありません(クラスが「難読化されたPython101」でない限り)。
msw 2012

1
より良い方法(少なくともPython 2.7では)は、「importlib」モジュールを使用することです:puzzle = importlib.import_module( '8puzzle')
Cédric

3
実際には、これには良いユースケースがあります-コンパイル/生産プロセスの一部として、Pythonモジュールを辞書形式で名前を付けると、連結するのが最も簡単です(通常は問題ではありませんが、定数とインポートが上部にあります。 'が下部にあるので、' 0 'で始まるいくつかのモジュールが役立ちます。)inotifyまたはwatchと組み合わせると、次のような異常なディレクトリレイアウトのデバッグにも役立ちます。watch-n.1'cat * | python 'は、Pythonアプリを10分の1秒ごとに(または少なくともできるだけ速く)ロードします。または:cat $(find .-name "* .py")| python
fatal_error

1
パーティーに遅れましたが、別のユースケースは、すべてランダムハッシュで始まるため、Alembic移行からのインポートです
kevlarr

35

上記の答えは正しいですが、今のところ、推奨される方法はimport_module関数を使用することです。

importlib.import_module(name, package=None)
モジュールをインポートします。name引数は、インポートするモジュールを絶対的または相対的な用語(たとえば、pkg.modまたは..mod)で指定します。名前が相対的な用語で指定されている場合、package引数は、パッケージ名を解決するためのアンカーとして機能するパッケージの名前に設定する必要があります(たとえば、import_module('..mod', 'pkg.subpkg')インポートします)pkg.mod)。

import_module()関数は、の単純化ラッパーとして機能し importlib.__import__()ます。これは、関数のすべてのセマンティクスがから派生していることを意味しimportlib.__import__()ます。これら2つの関数の最も重要な違いimport_module()は、指定されたパッケージまたはモジュール(eg pkg.mod)を__import__()返すのに対し、最上位のパッケージまたはモジュール(eg )を返すことpkgです。

インタプリタの実行開始以降に作成されたモジュールを動的にインポートする場合(たとえば、Pythonソースファイルを作成する場合)、invalidate_caches()インポートシステムが新しいモジュールを認識するために呼び出す必要がある場合があります。

__import__ 現在はお勧めしません。

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
組み込み__import__()関数の実装。

注モジュールのプログラムによるインポートではimport_module()、この関数の代わりに使用する必要があります。


おかげで動作しますが、数字で始まるこれらのファイルの1つに関数または変数をインポートすることはできません。私がする場合:an_imported_file = importlib.import_module('13_file')、それから私はすることができませんfrom an_imported_file import var_x。これを達成するためにできることはありますか?
マーティン

/usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in <module> from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
マーティン

また、Pycharmでan_imported_file輸入var_x `からのラインは、` ...赤い下線が引かれている
マーティン

申し訳ありません。私の一般的なアドバイスは、これを避けることです。
laike9m

0

.pyインポートで拡張機能を使用しないでください。

DOESのfrom 8puzzle import *作品?

そのfrom x import *モジュールの名前空間を現在のコンテキストにブリードするので、それが価値があるのは、好ましいPythonパターンではありません。

一般に、そのモジュールから特に必要なものをインポートしてみてください。他のモジュールから任意のグローバルをインポートできます。

たとえば、8puzzle.foo8puzzleインポートから `を実行できる場合

編集:

私の.pyメッセージは正しいですが、それだけでは十分ではありません。

他のポスターの__import__('8puzzle')提案は正しいです。ただし、このパターンは避けることを強くお勧めします

1つは、内部のプライベートPythonメソッドが予約されていることです。 あなたは基本的に、モジュールをインポートできることの意味についての基本的な仮定を破っています。 ファイルの名前を別の名前に変更するだけです。puzzle8これを修正できます。

これは、あなたのインポートが一番上にあることを知り、コードがPEP8に準拠することを期待している(しようとしている)経験豊富なPythonプログラマーの地獄を苛立たせます。


1
混乱してすみません。私がしたことはfrom 8puzzle import *、元の質問を編集したことです。そして、mvanveenが言ったようにそれは機能しません。
Simon Guo

それは私の悪いことです。モジュールのファイル名が数字で始まらないことを忘れました。編集を投稿しました。
mvanveen 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.