270

Windows の Wing IDE 内から PyLint を実行しています。プロジェクトにサブディレクトリ (パッケージ) があり、パッケージ内に最上位からモジュールをインポートします。

__init__.py
myapp.py
one.py
subdir\
    __init__.py
    two.py

最上位のディレクトリ (実行元) が Python パスにあるため、実行時two.pyに問題なく動作します。ただし、two.py で PyLint を実行すると、エラーが発生します。import onemyapp.py

F0401: Unable to import 'one'

これを修正するにはどうすればよいですか?

4

31 に答える 31

213

私が知っている2つのオプションがあります。

1 つは、環境変数を変更してPYTHONPATH、モジュールの上のディレクトリを含めることです。

~/.pylintrcまたは、次のように、モジュールの上にディレクトリを含めるように編集します。

[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'

(または、pylint の他のバージョンでは、init-hook で [General] を [MASTER] に変更する必要があります)

これらのオプションは両方とも機能するはずです。

それが役立つことを願っています。

于 2010-06-17T19:46:38.023 に答える
35

__init__.pyディレクトリがモジュールであることをpythonに知らせるために、両方のディレクトリに空のファイルがありますか?

フォルダー内から実行していない場合の基本的な概要は次のとおりです (つまり、使用していませんが、pylint から実行している可能性があります)。

topdir\
  __init__.py
  functions_etc.py
  subdir\
    __init__.py
    other_functions.py

これは、Python インタープリターが現在のディレクトリを参照せずにモジュールを認識している方法です。そのため、pylint が独自の絶対パスから実行されている場合は、またはで提供さfunctions_etc.pyれるとしてアクセスできます。topdir.functions_etctopdir.subdir.other_functionstopdirPYTHONPATH

更新: 問題が__init__.pyファイルではない場合は、モジュールをコピーまたは移動してみてくださいc:\Python26\Lib\site-packages。これは、追加のパッケージを配置する一般的な場所であり、確実に pythonpath になります。Windows のシンボリック リンクまたは同等の方法を知っている場合 (私は知りません!)、代わりにそれを行うことができます。ここにはさらに多くのオプションがあります: http://docs.python.org/install/index.html、開発コードのユーザーレベルのディレクトリに sys.path を追加するオプションを含みますが、実際には、通常はシンボリックにリンクするだけです私のローカル開発ディレクトリからサイトパッケージへ - それをコピーしても同じ効果があります。

于 2009-12-14T07:45:20.260 に答える
30

1) sys.path はリストです。

2)問題は、sys.path が virtualenv.path ではなく、virtualenvで pylint を使用したい場合があることです。

3) 前述のように、init-hook を使用します (' および " pylint の解析は厳密であることに注意してください)。

[Master]
init-hook='sys.path = ["/path/myapps/bin/", "/path/to/myapps/lib/python3.3/site-packages/", ... many paths here])'

また

[Master]
init-hook='sys.path = list(); sys.path.append("/path/to/foo")'

.. と

pylint --rcfile /path/to/pylintrc /path/to/module.py
于 2014-04-29T21:06:38.970 に答える
16

pylintrcプロジェクトのルートディレクトリに新しいファイルを追加しました

[MASTER]
init-hook='import sys; sys.path.append(".")'

PyCharm IDEで動作します

于 2021-03-23T16:58:33.553 に答える
9

WingIDEでどのように機能するかはわかりませんが、GeanyでPyLintを使用するために、外部コマンドを次のように設定しました。

PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f"

ここで、%fはファイル名、%dはパスです。誰かに役立つかもしれません:)

于 2010-11-12T08:12:32.483 に答える
3

私が発見したばかりの 1 つの回避策は、単一のファイルではなく、パッケージ全体に対して実際に PyLint を実行することです。どういうわけか、インポートされたモジュールを見つけることができます。

于 2009-12-16T06:15:10.370 に答える
3

私はこれと同じ問題を抱えていたので、virtualenv に pylint をインストールし、.pylintrc ファイルをプロジェクト ディレクトリに追加して、ファイルに次のように記述して修正しました。

[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'
于 2016-07-26T17:17:15.990 に答える
3

試す

if __name__ == '__main__':
    from [whatever the name of your package is] import one
else:
    import one

Python 3 では、else句の部分の構文は次のようになることに注意してください。

from .. import one

よく考えてみると、これはおそらく特定の問題を解決しないでしょう。質問を誤解していて、two.py がメイン モジュールとして実行されていると思っていましたが、そうではありません。absolute_importまた、Python 2.6 (からのインポートなし) と Python 3.x がインポートを処理する方法の違いを考慮すると、__future__とにかく Python 2.6 に対してこれを行う必要はないと思います。

それでも、最終的に Python 3 に切り替えて、モジュールをパッケージ モジュールとパッケージ内のスタンドアロン スクリプトの両方として使用する予定がある場合は、次のようなものを保持することをお勧めします。

if __name__ == '__main__':
    from [whatever the name of your package is] import one   # assuming the package is in the current working directory or a subdirectory of PYTHONPATH
else:
    from .. import one

念頭に置いて。

編集:そして今、あなたの実際の問題に対する可能な解決策について。モジュールを含むディレクトリから PyLint をone(おそらくコマンド ライン経由で) 実行するか、PyLint の実行時に次のコードをどこかに配置します。

import os

olddir = os.getcwd()
os.chdir([path_of_directory_containing_module_one])
import one
os.chdir(olddir)

基本的に、PYTHONPATH をいじる代わりに、現在の作業ディレクトリがone.py、インポートを行うときに含まれているディレクトリであることを確認してください。

(ブライアンの答えを見ると、おそらく前のコードを に割り当てることができますがinit_hook、それを行う場合は、彼が行ったものに追加するだけで済みますsys.path。これは、私のソリューションよりもわずかにエレガントです。)

于 2010-06-17T20:03:20.887 に答える
2

sys.path重要なのは、env 変数を考慮せずにプロジェクト ディレクトリを追加することです。

VSCode を使用している人のために、プロジェクトのベース ディレクトリがある場合の 1 行のソリューションを次に示します。

[MASTER]
init-hook='base_dir="my_spider"; import sys,os,re; _re=re.search(r".+\/" + base_dir, os.getcwd()); project_dir = _re.group() if _re else os.path.join(os.getcwd(), base_dir); sys.path.append(project_dir)'

少し説明しましょう:

  • re.search(r".+\/" + base_dir, os.getcwd()).group(): 編集ファイルに従ってベース ディレクトリを検索

  • os.path.join(os.getcwd(), base_dir):コマンドライン環境に合わせcwdて追加sys.path


参考までに、これが私の .pylintrc です。

https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f

于 2016-05-15T13:09:15.863 に答える
2

私は同じ問題を抱えていましたが、答えが見つからなかったので、これが同様の問題を抱えている人に役立つことを願っています.

私はepylintでflymakeを使用しています。基本的に私がしたことは、dired ディレクトリが python パッケージ ディレクトリであるかどうかをチェックする dired-mode-hook を追加することでした。ある場合は、PYTHONPATH に追加します。私の場合、ディレクトリに「setup.py」という名前のファイルが含まれている場合、そのディレクトリは python パッケージであると見なします。

;;;;;;;;;;;;;;;;;
;; PYTHON PATH ;;
;;;;;;;;;;;;;;;;;

(defun python-expand-path ()
  "Append a directory to the PYTHONPATH."
  (interactive
   (let ((string (read-directory-name 
          "Python package directory: " 
          nil 
          'my-history)))
     (setenv "PYTHONPATH" (concat (expand-file-name string)
                  (getenv ":PYTHONPATH"))))))

(defun pythonpath-dired-mode-hook ()
  (let ((setup_py (concat default-directory "setup.py"))
    (directory (expand-file-name default-directory)))
    ;;   (if (file-exists-p setup_py)
    (if (is-python-package-directory directory)
    (let ((pythonpath (concat (getenv "PYTHONPATH") ":" 
                  (expand-file-name directory))))
      (setenv "PYTHONPATH" pythonpath)
      (message (concat "PYTHONPATH=" (getenv "PYTHONPATH")))))))

(defun is-python-package-directory (directory)
  (let ((setup_py (concat directory "setup.py")))
    (file-exists-p setup_py)))

(add-hook 'dired-mode-hook 'pythonpath-dired-mode-hook)

お役に立てれば。

于 2013-11-09T23:11:44.593 に答える
2

まず、VS Code に移動し、「ctrl + shift + p」を押します。

次に、settings.json を検索します。

次に、以下のコードを settings.jason 内に貼り付けます。問題が解決されることを願っています。

{

"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"

}

于 2020-10-11T13:52:46.660 に答える
1

たぶん、PYTHONPATH内にディレクトリを手動で追加することによって?

sys.path.append(dirname)
于 2009-12-15T12:08:13.347 に答える
1

Mac ユーザー: Anaconda 3 と vsCode を使用していて、複数の環境がある場合は、settings.jsonvsCode を介して次のパスを指定することもできます。

{
  "python.pythonPath": "/Users/username/opt/anaconda3/bin/python",
  "python.linting.pylintPath": "/Users/username/opt/anaconda3/bin/python"
}
于 2021-03-17T16:44:35.590 に答える
1

Windows を使用している場合:

  • 作成したばかりの仮想環境内の python.exe のパスを取得します
  • このようにする必要がありますZ:\YourProjectFolder\Scripts\python.exe
  • 次に、vscodeに移動してユーザーを編集しますsettings.json
  • 次の行を追加します。"python.pythonPath": "Z:\\YourProjectFolder\\Scripts\\python.exe"
  • それを保存すると、問題が解決するはずです
  • 注:jsonファイルに入れるときは、単一​​の代わりに二重のバックスラッシュ
{
    "python.pythonPath": "Z:\\YourProjectFolder\\Scripts\\python.exe"
}
于 2021-04-02T15:36:03.813 に答える
0

~/.pylintrc を編集して、次のようにモジュールの上にディレクトリを含めます。

[MASTER]
init-hook='import sys,os;[sys.path.append("your_workspace_path"+di) for di in os.listdir("your_workspace_path")]'
于 2022-02-16T13:06:58.077 に答える