1

正如标题所说:

>>> from subprocess import check_output
>>> check_output(['ln', '~/other_folder/src/models/sc_models.py', './src/models/sc_models.py'])
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
CalledProcessError: Command '['ln', '~/other_folder/src/models/sc_models.py', './src/models/sc_models.py']' returned non-zero exit status 1
>>> exit()
$ ln ~/other_folder/src/models/sc_models.py ./src/models/sc_models.py
$

怎么会这样?它如何从命令行成功,但从 Python 子进程调用失败?

欢迎所有提示!

4

1 回答 1

6

您需要使用os.path.expanduser

在 Unix 和 Windows 上,返回带有 ~ 或 ~user 的初始组件的参数,替换为该用户的主目录。

import os

os.path.expanduser('~/other_folder/src/models/sc_models.py')

In [2]: os.path.expanduser("~")
Out[2]: '/home/padraic'

Python 正在寻找一个以~您的 cwd 命名的目录,但显然失败了。当您从 bash 运行代码时,它~会被扩展,除非您要使用shell=True将命令传递给 shell 并且 shell 会扩展波浪号的位置,否则您将需要使用os.path.expanduser或传递整个路径,即 /home/user/other_folder ......我会坚持使用 shell=False 和os.path.expanduser("~").

于 2015-05-27T14:59:34.777 回答