PyCharm可正常运行的Python脚本,如何在Shell中指定工作目录执行?
我懂你的困扰——PyCharm帮你悄悄做了不少配置,到了Shell里就得手动还原这些设置才能正常运行。核心问题有两个:一是PyCharm的Add content roots to PYTHONPATH选项自动把项目根目录加到了Python的模块搜索路径,而Shell默认不会这么做,导致你找不到tools模块;二是你需要确保执行脚本时的工作目录是data/。下面给你几个靠谱的解决方案:
方法1:临时设置PYTHONPATH(适合临时执行)
这是最直接还原PyCharm配置的方式——手动把项目根目录塞进PYTHONPATH,同时切换到data目录执行脚本。
假设你的项目根目录是/path/to/your/project(就是包含data、main、tools三个文件夹的那个目录),在bash/zsh里可以这么写:
# 先切换到data目录 cd /path/to/your/project/data # 设置PYTHONPATH为项目根,然后执行脚本 PYTHONPATH=/path/to/your/project python ../main/script.py
如果想一步到位,也可以用一行命令:
PYTHONPATH=/path/to/your/project python -c "import os; os.chdir('/path/to/your/project/data'); exec(open('/path/to/your/project/main/script.py').read())"
方法2:修改脚本自动添加路径(适合长期使用)
如果不想每次执行都手动设置PYTHONPATH,可以在script.py的最开头加一段代码,自动把项目根目录加到Python的搜索路径里。这样不管你在哪里执行脚本,只要脚本的相对位置不变,就能正常导入模块。
修改main/script.py:
import sys import os # 获取项目根目录:script.py在main文件夹,往上走一级就是项目根 project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # 把项目根加到搜索路径 sys.path.append(project_root) # 现在再导入模块就没问题了 from tools import my_strings # 你的其他代码...
然后执行的时候只需要切换到data目录即可:
cd /path/to/your/project/data python ../main/script.py
方法3:用Python模块方式运行(更规范)
因为你的main文件夹已经有__init__.py,属于Python包,所以可以用-m参数以模块方式运行,这样Python会自动把当前目录加到PYTHONPATH里(前提是你从项目根执行)。同时我们可以调整工作目录:
# 先切换到项目根目录 cd /path/to/your/project # 设置工作目录为data,然后运行main.script模块 PYTHONPATH=. python -c "import os; os.chdir('data'); import main.script"
或者更简洁的方式,先切换到data目录,再把项目根(也就是..)加到PYTHONPATH,最后运行模块:
cd /path/to/your/project/data PYTHONPATH=.. python -m main.script
这种方式更符合Python的模块规范,也能避免直接执行脚本带来的一些路径问题。
内容的提问来源于stack exchange,提问作者Simeon Borko

