代码之家  ›  专栏  ›  技术社区  ›  Tim Wescott

运行子目录中的.py文件

  •  1
  • Tim Wescott  · 技术社区  · 5 月前

    我觉得这应该很明显,但我没有找到正确的搜索词。我可以从项目的根目录运行文件,但不能从子目录运行。我该怎么解决这个问题?

    我有一个目录树,看起来像这样:

    $ tree
    .
    ├── kalman
    │   ├── find_observibility.py
    │   ├── __init__.py
    │   ├── kalman.py
    │   └── model.py
    

    find_observibility.py 进口自 kalman .

    如果我复制 find_observibility.py 深入我的项目,它运行得很好。但是,当我尝试从它的子目录运行它时,我得到了一个错误:

    $ ./kalman/find_observibility.py 
    Traceback (most recent call last):
      File "/home/tim/Documents/software/cl_kalman/./kalman/find_observibility.py", line 3, in <module>
        from kalman import outputJacobian, stateJacobian, stateTransition
      File "/home/tim/Documents/software/cl_kalman/kalman/kalman.py", line 6, in <module>
        from kalman.model import modelOutput, stateTransition
    ModuleNotFoundError: No module named 'kalman.model'; 'kalman' is not a package
    

    这里 find_observability.py :

    #! /usr/bin/env python3
    
    from kalman import outputJacobian, stateJacobian, stateTransition
    from make_flight import Rising, Rounds
    
    if '__main__' == __name__:
        print('oh my')
    

    这里 kalman/__init__.py :

    from .model import initialState, modelOutput, stateTransition
    from .kalman import outputJacobian, stateJacobian
    

    如有线索,将不胜感激。解决方案更多。提前感谢。

    3 回复  |  直到 5 月前
        1
  •  1
  •   Naveed Ahmed    5 月前

    不同的人会提出不同的解决方案,因为有多种方法可以解决这个问题。

    方法1

    添加要在其中运行脚本的子目录的路径 sys.path 事实上,你可以添加尽可能多的路径,让编译器从给定的位置找到脚本。

    方法2

    您可以编写一个单独的python文件,名为 setup.py 并在主脚本中调用它。此文件应按如下方式工作:

    假设你的文件结构如下

    app/
      __init__.py
      mymodule.py
      inner_folder/
      myscript.py
    setup.py
    

    你的 setup.py 应该看起来有点像这样

    from setuptools import setup
    
    setup(
       name='my-app',
       version='0.1',
       packages=['app'],
       install_requires=[
           # a list of required packages if needed
        ],
     )
    

    原始来源: Why does my python not add current working directory to the path?

        2
  •  0
  •   Austin Glander    5 月前

    看起来kalman.py正试图从名为kalman的目录导入model.py,请尝试将kalman.py的第6行替换为以下内容:

    from model import modelOutput, stateTransition
    

    您可以使用操作系统库根据执行主文件的位置动态调整导入位置。

        3
  •  0
  •   Tim Wescott    5 月前

    感谢@NaveedAhmed。 This answer 作品(事后看来很明显:O):

    $ python -m kalman.find_observibility 
    oh my