zoukankan      html  css  js  c++  java
  • Pyhon环境变量的一些坑

    在正常的情况下,使用编译器执行Python文件,无需考虑环境变量的改变

    例:sum

        --one

          --one1.py

        --two

          --two1.py

    在执行one.py文件需要调用 two.py中某个方法,正常在编译器上的使用:from two import two1

    在这里是涉及到一个名词,环境变量

    我们利用Python的环境执行py文件时,需要到对应的目录下执行,但环境变量的出现,让我们在任何目录下可以执行py文件

    查看当前环境变量

    one1.py:

    import os,sys
    for i in sys.path:
        print(i)

    环境变量的操作在编译器已经帮我们做好了,无需我们考虑这些问题

    但在实际的编译环境中并不会用编译器来执行文件,这时会存在一个问题,即当前执行当前文件时,sum目录的环境变量是不存在的,即无法正常调用:from two import two1

    所以需要添加一个sum目录的环境变量

    import os,sys
    sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../")  #添加当前文件的上一层目录的环境变量, .. 为上一层目录
    from two import two
    for i in sys.path:
        print(i)

     这时你查看一下是否多了个sum目录的环境变量

    这时的你很开心的以为万事大吉,殊不知在linux环境下还存在一个坑

    Linux中按照以上的目录结构上是无法调用到two1.py文件的,因为我们是调用的是包(packages)下的模块two1.py,但是在上述的目录结构中two是一个文件夹,导致无法调用two1.py文件

    一些关于模块的介绍:

    包(packages)其实也是模块,其类型Type也是module。通常引用自定义模块时有两种方法:
      1)将两个文件放在同一目录下。
      2)在sys.path下添加要引用的py文件的路径。然后import。
    这样的做法,对于少数文件是可行的,但如果程序数目很多,层级很复杂时就比较麻烦了。此时用package就能将多个py文件组织起来,类似于第三方包一样的引用。要方便很多。
    
    package的层次结构与程序所在目录的层次结构相同,且必须包含一个__init__.py的文件。__init__.py可以为空,只要它存在就表明此目录被作为一个package处理。

    so,正确的目录结构如下:

    sum

     --one

      --__init__.py

      --one1.py

     --two

      --__init__.py

      --two1.py

    最后附上一些模块解释的启发的文章:https://blog.csdn.net/maryhuan/article/details/22048763

  • 相关阅读:
    Cannot load php5apache2_4.dll into server
    goroutine,channel
    为什么 Go 标准库中有些函数只有签名,没有函数体?
    PHP编码风格规范
    etcd压测造成数据目录过大恢复
    高可用kubernetes集群查看kube-scheduler和kube-controller-manager哪个是leader节点
    kubeadm join添加节点,新加节点夯在not ready(cni config uninitialized)
    一次.dockerignore设置错误导致的docker build排查
    通过开源插件实现sonarqube区分不同分支显示代码扫描结果
    python脚本,调用接口清理镜像多余tag
  • 原文地址:https://www.cnblogs.com/tang-s/p/9504944.html
Copyright © 2011-2022 走看看