同様の質問が以前に聞かれたことがあることは知っています...しかし、私は簡単な疑いがありました...このリンクをたどっていました: https://www.python-course.eu/python3_packages.php
私のコード構造:
_my-project
-- __init__.py
-- src
-- __init__.py
-- file1.py
-- test
-- __init__.py
-- test_file1.py
_
test_file1.py:
_import unittest
from src.file1 import *
class TestWriteDataBRToOS(unittest.TestCase):
def test_getData(self):
sampleData = classInFile1()
sampleData.getData()
self.assertNotEqual(sampleData.usrname, "")
if __name__ == '__main__':
unittest.main()
_
ここでエラーが発生します:
_ModuleNotFoundError: No module named 'src'
_
に変更した場合:
_import sys
sys.path.insert(0, '../src')
import unittest
from file1 import *
_
その後、動作します!
誰かが、上記のリンクで説明されているように機能しない理由、またはsys.path.insert(0, '../src')
ステートメントを書く代わりに他の方法で動作しない理由を理解するのに役立ちますか。
ありがとう!
編集:
my-project dirから実行した後: `python -m unittest test/test_file1/TestWriteDataBRToOS上記で更新されたエラーが表示されます。
_Traceback (most recent call last):
File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/usr/lib/python2.7/unittest/__main__.py", line 12, in <module>
main(module=None)
File "/usr/lib/python2.7/unittest/main.py", line 94, in __init__
self.parseArgs(argv)
File "/usr/lib/python2.7/unittest/main.py", line 149, in parseArgs
self.createTests()
File "/usr/lib/python2.7/unittest/main.py", line 158, in createTests
self.module)
File "/usr/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names]
File "/usr/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName
module = __import__('.'.join(parts_copy))
ImportError: Import by filename is not supported.
_
test
フォルダーからではなく、my-project
フォルダーからテストを実行する必要があります。
python -m unittest test.test_file1.TestWriteDataBRToOS
これは、おそらく「src」フォルダーへのパスが正しく指定されていないために、「src」という名前のモジュールを見つけることができないためです。 src.file1を直接記述する場合、「src」ファイルは、現在のpython file(test_file1.py)が配置されているディレクトリと同じディレクトリに存在する必要があります。同じディレクトリの場合、ディレクトリ全体を指定する必要があります。sys.path.insert(0, '../src')
が機能した理由は、..
は、ディレクトリを1つ上に移動します。これは、srcフォルダがある場所です。 test_file1.pyの作業ディレクトリが/ usr/bin/pythonの場合、srcフォルダの場所は/ usr/bin/srcになります。現在の作業ディレクトリとは異なるため、pythonファイルは 'src'モジュールを見つけることができません。