我创建了某些文件夹和文件结构,以使我的项目更易于维护并且随着时间的推移更具灵活性。
我以这种形式存储了这些文件夹和 Python 脚本:
/home/ubuntu/main_folder
:在此文件夹中我有以下模式:
|-main_foler
|
|-module1
|---script.py
|
|configetl
|---config.py
|
|process.sh
我期待着以可执行脚本的module1
名称执行存储在文件夹中的脚本:script.py
process.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.py
process.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
,您必须将路径附加到列表configetl
中sys.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