Python FTP上传脚本在Bash文件中无法运行,但终端可正常执行
我来帮你一步步定位并解决这个问题,先从几个最常见的关键点入手:
1. 先捕获错误信息,找到问题根源
你的Bash脚本目前没有输出任何错误提示,这让排查变得很困难。先修改Bash脚本,把Python执行时的错误信息也打印出来:
#!/usr/bin/env bash python3.6 "upload.py" 2>&1 exit 0
运行这个修改后的Bash脚本,就能看到Python抛出的具体错误(比如文件找不到、FTP权限不足、连接失败等),这是排查的核心第一步。
2. 确保工作目录一致
终端直接运行Python脚本时,你的工作目录就是upload.py所在的目录,但运行Bash脚本时,工作目录可能不是这个路径(比如你在其他文件夹下执行./xxx/script.sh)。这会导致open('index.html','rb')找不到本地文件。
解决方法:在Bash脚本里先切换到脚本自身所在的目录,再执行Python代码:
#!/usr/bin/env bash # 切换到当前Bash脚本所在的目录 cd "$(dirname "$0")" python3.6 "upload.py" 2>&1 exit 0
$(dirname "$0")会自动获取Bash脚本的所在路径,切换后就能保证相对路径的正确性。
3. 验证Python环境的一致性
终端里的python3.6和Bash脚本调用的python3.6可能不是同一个环境——比如Bash执行时的PATH环境变量和终端不同,导致调用了另一个版本的Python,或者缺少依赖库。
验证方法:
- 在终端执行:
which python3.6和python3.6 -c "import ftplib; print(ftplib.__file__)" - 在Bash脚本里也加入这两行命令,对比输出是否一致。
如果不一致,在Bash脚本里使用Python的绝对路径(比如/usr/bin/python3.6)来调用即可。
4. 修复FTP上传命令的路径错误
你的Python脚本里的FTP上传命令有明显问题:
session.storbinary('STOR ' + '/', file)
STOR /只指定了服务器的根目录,但没有指定文件名,FTP服务器通常会拒绝这种请求,或者不知道该把文件存成什么。应该修改为指定目标文件名:
session.storbinary('STOR /index.html', file)
如果需要上传到服务器的特定子目录,也可以先切换目录再上传:
session.cwd('/your/target/folder') # 切换到服务器目标目录 session.storbinary('STOR index.html', file)
5. 给Python脚本添加错误捕获,细化排查
在Python脚本里加入异常捕获,能更精准地定位是连接、文件读取还是上传环节出了问题:
import ftplib try: session = ftplib.FTP('server address','username','password') print("成功连接到FTP服务器") file = open('index.html','rb') print("成功打开本地文件index.html") session.storbinary('STOR /index.html', file) print("文件上传完成") file.close() session.quit() except Exception as e: print(f"执行出错: {str(e)}")
内容的提问来源于stack exchange,提问作者Bronson77

