好吧,我相信这是一个非常愚蠢的问题,应该已经回答了很多次了。但我找不到任何对我有效的解决办法。
**我的问题:**我有一个包,我们称之为my_pack
。其中包含以下文件:
__init__.py
:
import A
A.py
:
import B
def A():
B.B()
if __name__=='__main__':
A()
B.py
:
def B():
print('B Called')
我想:
- 将软件包
my_pack
用作独立应用程序,例如呼叫python3 A.py
- 从位于不同位置的其他python脚本导入它。
- 不要 * 使用pip:该应用程序将部署在嵌入式系统上,默认情况下不安装pip。最好是,我不想仅仅为了这个而包含pip。
现行办法:
- 不要 * 使用pip:该应用程序将部署在嵌入式系统上,默认情况下不安装pip。最好是,我不想仅仅为了这个而包含pip。
- 在所有地方使用绝对路径。这显然是非常丑陋的,我不想这样做。
- 创建本地(pip)包。据我所知,唯一简单的方法是使用pip。这对我的案子来说并不理想。
- 使用相对导入并编辑每个
__init__.py
文件中的python路径。这是可行的,但也是相当丑陋的。 - 将包添加到python-path:从理论上讲,这应该可以工作,但我在包内的相对导入方面遇到了不少麻烦。这让我想到,这也不是一个好的解决方案。这些问题是:
- 在软件包中,我宁愿不使用相对导入。只是因为我需要将所有正常导入转换为相对导入。
- 现在,我得到一个
ImportError: attempted relative import with no known parent package
错误。我相信,这是可以解决的,但我不确定如何容易或好的解决这个问题。
目前,我首选的解决方案是将其添加到python路径中并使用相对导入。然而,我不认为,我目前的做法是好的。我认为,Python应该有一个更好、更简单的解决方案。
我错过了其他的可能性吗?或者这只是一个问题,python没有很好的解决方案?
我正在使用python3.9.5
2条答案
按热度按时间mrfwxfqh1#
将包添加到Python路径并使用相对导入的首选解决方案确实是一种有效的方法。但是,您可以进行一些改进来简化过程并避免您提到的一些问题。这里有一个修正的方法:
main.py
,它将作为您独立应用的入口点。A.py
:**修改A.py
使用相对导入,而不是绝对导入。这将允许它既作为包的一部分工作,也可以从其他脚本导入。B.py
:**由于B.py
是独立模块,没有任何依赖关系,所以可以保持原样。下面是更新后的文件结构:
每个文件的修订代码如下:
__init__.py
:A.py
:B.py
:main.py
:要运行独立应用程序,您需要执行
python3 main.py
。从位于不同位置的其他Python脚本导入
my_pack
时,需要确保包含my_pack
的目录包含在PYTHONPATH环境变量中。您可以在运行脚本之前在终端中临时设置PYTHONPATH:
或者您可以在导入
my_pack
之前在脚本中以编程方式设置它:通过遵循这种方法,您可以将
my_pack
包作为独立应用程序使用,也可以将其从其他Python脚本导入时使用,而不需要pip或绝对路径。hc8w905p2#
现在你的工作目录是“/home/name/hh”
但是你想从这个目录导入“/home/name/kk/”
公司A.py
公司C.py
公司K.py
/home/name/kk/init.py
你可以使用“sys”来添加一个python环境路径