python 3.x 使用链接脚本执行脚本 ubuntu

python 3.x 使用链接脚本执行脚本 ubuntu

我创建了某些文件夹和文件结构,以使我的项目更易于维护并且随着时间的推移更具灵活性。

我以这种形式存储了这些文件夹和 Python 脚本:

/home/ubuntu/main_folder:在此文件夹中我有以下模式:

     |-main_foler
     |
     |-module1
     |---script.py
     |
     |configetl
     |---config.py
     |
     |process.sh

我期待着以可执行脚本的module1名称执行存储在文件夹中的脚本:script.pyprocess.sh

     #!/bin/sh
     cd /home/ubuntu/main_folder &&

     python3 module1/script.py

执行脚本时会出现问题,因为使用了来自存储在名为的文件夹中的脚本的一堆方法configetl

        error: File "module1/script.py", line 4, in <module>
          from configetl.config import *
        ImportError: No module named 'configetl'

我应该如何正确设置我的脚本sh以避免这种情况并在 cron 中自动安排该脚本?

非常感谢。

答案1

script.py可能无法访问config.py,因为该目录configetl不在script.py的 PYTHONPATH 中。

您可以通过在脚本调用时打印sys.path列表来测试这一点。script.pyprocess.sh

# Inside your script.py before calling any config functions
import sys
print(sys.path)

输出应类似于此:

['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/lib/python3.6/site-packages']

要将configetl目录包含到您的 PYTHONPATH 中并使其对可见script.py,您必须将路径附加到列表configetlsys.path

# Inside your script.py before calling any config functions
import sys
sys.path.append('../')

这会将整个上级目录附加到您的 PYTHONPATH。

如果您只想将configetl目录添加到您的 PYTHONPATH,您可以执行以下操作:

# Inside your script.py before calling any config functions
import sys
sys.path.append('../configetl')

这需要对导入模块的方式进行一些小的更改config.py。您必须直接导入它,而不使用其父目录名称,例如

from config import *

PS 使用星号从 Python 模块导入所有内容被认为是一种不好的做法。您应该导入整个模块import config或列出要从该模块导入的对象,例如from config import function_one, function_two

相关内容