my_package\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_module.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\nRun Code Online (Sandbox Code Playgroud)\n该模块my_module.py有一个func我试图导入的函数。
该setup.py文件具有以下内容。
my_package\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_package\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_module.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\nRun Code Online (Sandbox Code Playgroud)\n我正在安装该软件包:
\nvirtualenv --python=/usr/bin/python3.8 venv\nsource venv/bin/activate\npython my_package/setup.py install\nRun Code Online (Sandbox Code Playgroud)\n然后使用以下命令导入它:
\nfrom setuptools import setup, find_packages\n\nsetup(\n name=\'my_package\',\n packages=find_packages(where=\'my_package\'),\n version=\'1.0\'\n)\nRun Code Online (Sandbox Code Playgroud)\n但是,第二次导入失败,并显示:
\nImportError: cannot import name \'my_module\' from \'my_package\' (unknown location)\nRun Code Online (Sandbox Code Playgroud)\n此外,运行dir(my_package)显示该my_module名称确实未导入。\n[\'__doc__\', \'__file__\', \'__loader__\', \'__name__\', \'__package__\', \'__path__\', \'__spec__\']
如果解决方案证明不成功,则无法导入 setup.py 安装的包。
\nImportError:无法从“serial”(未知位置)导入名称“Serial”,添加__init__.py文件my_package/my_package不起作用。
您正在test.py目录的父目录中运行脚本my_package。因此,test.py将尝试将my_package子目录作为包/模块导入,而不是您安装的包。您将需要移动到不包含源代码的目录,然后运行测试。这可以像test在my_package主目录的子目录中运行它一样简单。
只需确保您cd明确进入该目录,而不是使用完整路径运行它(例如,python3.8 my_package/test/test.py,因为那样它仍然会导入错误的my_package.
其原因(也是问题的原因)是 Pythonsys.path在开始时自动将当前工作目录包含在 , 中,因此会尝试将主my_package目录作为包导入。