63715


ソースコードは以下の通りです。  
aaa.py

[code]

    class aaa(object):
      __slots__ = ['_first']
      def __init__(self):
        self._first = ''
    
[/code]

bbb.py

[code]

    import aaa as a
    
    class bbb(a.aaa):
      __slots__ = ['_name']
      def __init__(self):
        super().__init__()
        self._name = ''
        pass
    
      pass
    
[/code]

**ファイル構成が以下の場合には問題ありません。**  
(問題がないというのは **pylintのエラーにならない** ということです)  
(かつ、 **bbb.pyを実行してもエラーにならない** 。)

[code]

    └─forTest
        │  aaa.py
        │  bbb.py
        │
        └─__pycache__
                aaa.cpython-37.pyc
    
[/code]

[![pylintエラーなし](https://i.stack.imgur.com/MOT8V.png)](https://i.stack.imgur.com/MOT8V.png)

* * *

ところが、以下のように **__init__.pyを追加** すると

[code]

    └─forTest
        │  aaa.py
        │  bbb.py
        │  __init__.py
        │
        └─__pycache__
                aaa.cpython-37.pyc
    
[/code]

**pylintのエラーが発生** するのです。  
[![pylintのエラーが発生する](https://i.stack.imgur.com/1wryr.png)](https://i.stack.imgur.com/1wryr.png)  
[![pylintのエラー内容](https://i.stack.imgur.com/mTh09.png)](https://i.stack.imgur.com/mTh09.png)

* * *

そこで、  
**import aaa as a >>>> from . import aaa as a**  
にすると、エラーにはなりません。

[![fromだとエラーは発生しない](https://i.stack.imgur.com/0TQn7.png)](https://i.stack.imgur.com/0TQn7.png)

ですが、 **このbbb.pyを実行するとエラーになる** のです。

cannnot import name 'aaa' from '`__main__`'

[![cannot
import](https://i.stack.imgur.com/7olrv.png)](https://i.stack.imgur.com/7olrv.png)

* * *

ここまできてわからなくなりました。  
pylilntのエラーにならず、  
bbb.pyを実行してもimportできるようにするにはどうすればよいのでしょうか？  
よろしくお願いします。

* * *

環境  
vscode:1.42.1  
Python: 3.7.3 32-bit('base':conda)

pylint --version の結果は以下の通り。

pylint 2.3.1  
astroid 2.2.5  
Python 3.7.3 (default, Apr 24 2019, 13:20:13) [MSC v.1915 32 bit (Intel)]

* * *

conda update --all の後  
pylint --version の結果は以下の通り。

pylint 2.4.4  
astroid 2.3.3  
Python 3.7.6 (default, Jan 8 2020, 16:21:45) [MSC v.1916 32 bit (Intel)]


CC BY-SA 4.0
2020-02-23T06:09:22.597
63294
2021-09-16T03:08:05.723
2020-03-10T02:55:31.520
2238
37851
question
python python3 vscode anaconda anaconda3
__init__.py があると、”Unable to import '○○○'pylint(import-error)" になる


無理です。両立しません。

`__init__.py`を置いた時点で「forTestディレトリをパッケージとして取り扱う」と **プログラマが意図している** ことになります。  
そうすると、そこに置いている`bb.py`は「forTestパッケージのファイル」として取り扱えとプログラマがPythonにそう **指示している**
ことになります。`bb.py`はforTestディレクトリをカレントにして実行するファイルではありませんよ、ということです。

だから、  
`from aaa as s`と書くとpylintのエラーが発生します。「パッケージとして取り扱う」という意図に反するからです。  
`from . import aaa as
a`と書くとpylintのエラーは消えます。「パッケージとして取り扱う」という意図に沿うからです。で、そうするとそこをカレントにしての実行はできません。

* * *

全体の構成として  
パッケージ扱いにしない  
か  
実行するpyファイルがある場所をカレントとして見て、その下にパッケージとして取り扱うディレクトリ群を置く  
かの選択になります。

* * *

後者を選んで`from . import aaa as a`と書いた場合でも、  
forTestの **一つ上** をカレントディレクトリにして、`python -m
forTest.bb`で実行する([参考](https://docs.python.org/ja/3/using/cmdline.html#interface-
options))  
という方法はあります。


CC BY-SA 4.0
2020-03-10T02:47:50.680
63715
2020-03-10T02:47:50.680
12274
63294
answer