最好的方式来组织本地python包没有pip

nue99wik  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(106)

好吧,我相信这是一个非常愚蠢的问题,应该已经回答了很多次了。但我找不到任何对我有效的解决办法。

**我的问题:**我有一个包,我们称之为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。这对我的案子来说并不理想。
  • 使用相对导入并编辑每个__init__.py文件中的python路径。这是可行的,但也是相当丑陋的。
  • 将包添加到python-path:从理论上讲,这应该可以工作,但我在包内的相对导入方面遇到了不少麻烦。这让我想到,这也不是一个好的解决方案。这些问题是:
  • 在软件包中,我宁愿不使用相对导入。只是因为我需要将所有正常导入转换为相对导入。
  • 现在,我得到一个ImportError: attempted relative import with no known parent package错误。我相信,这是可以解决的,但我不确定如何容易或好的解决这个问题。

目前,我首选的解决方案是将其添加到python路径中并使用相对导入。然而,我不认为,我目前的做法是好的。我认为,Python应该有一个更好、更简单的解决方案。
我错过了其他的可能性吗?或者这只是一个问题,python没有很好的解决方案?
我正在使用python3.9.5

mrfwxfqh

mrfwxfqh1#

将包添加到Python路径并使用相对导入的首选解决方案确实是一种有效的方法。但是,您可以进行一些改进来简化过程并避免您提到的一些问题。这里有一个修正的方法:

    • 1.使用主脚本:**在包目录外创建一个单独的脚本,我们称之为main.py,它将作为您独立应用的入口点。
    • 2.更新A.py:**修改A.py使用相对导入,而不是绝对导入。这将允许它既作为包的一部分工作,也可以从其他脚本导入。
    • 3.修改B.py:**由于B.py是独立模块,没有任何依赖关系,所以可以保持原样。
    • 4.设置PYTHONPATH环境变量:**在运行单机应用之前,您可以设置PYTHONPATH环境变量,使其包含您的包所在的目录。这将允许Python正确地查找和导入包。

下面是更新后的文件结构:

my_pack/
  __init__.py
  A.py
  B.py
main.py

每个文件的修订代码如下:
__init__.py

from . import A

A.py

from . import B

def A():
   B.B()

if __name__ == '__main__':
   A()

B.py

def B():
   print('B Called')

main.py

from my_pack import A

if __name__ == '__main__':
    A.A()

要运行独立应用程序,您需要执行python3 main.py
从位于不同位置的其他Python脚本导入my_pack时,需要确保包含my_pack的目录包含在PYTHONPATH环境变量中。
您可以在运行脚本之前在终端中临时设置PYTHONPATH:

$ export PYTHONPATH=/path/to/my_pack:$PYTHONPATH
$ python3 my_script.py

或者您可以在导入my_pack之前在脚本中以编程方式设置它:

import sys
import os

# Add the directory containing my_pack to PYTHONPATH
package_dir = '/path/to/my_pack'
sys.path.append(package_dir)

# Now you can import my_pack
from my_pack import A

通过遵循这种方法,您可以将my_pack包作为独立应用程序使用,也可以将其从其他Python脚本导入时使用,而不需要pip或绝对路径。

hc8w905p

hc8w905p2#

现在你的工作目录是“/home/name/hh”
但是你想从这个目录导入“/home/name/kk/”
公司A.py
公司C.py
公司K.py
/home/name/kk/init.py
你可以使用“sys”来添加一个python环境路径

import sys
sys.path.append(r"/home/name/kk")
import K
import A
import C

相关问题