Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python子进程popen将主目录设置为cwd_Python_Linux_Python 3.x_Subprocess_Popen - Fatal编程技术网

python子进程popen将主目录设置为cwd

python子进程popen将主目录设置为cwd,python,linux,python-3.x,subprocess,popen,Python,Linux,Python 3.x,Subprocess,Popen,我有个小问题。我在ubuntu 16.04机器上,在python脚本中,我想启动一个子进程,它应该在用户的主目录中启动。我试了一下: subprocess.Popen('echo "Test"', cwd="~", shell=True,universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable="/bin/bash") 但当我这样做时,我会

我有个小问题。我在ubuntu 16.04机器上,在python脚本中,我想启动一个子进程,它应该在用户的主目录中启动。我试了一下:

subprocess.Popen('echo "Test"', cwd="~", shell=True,universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable="/bin/bash")
但当我这样做时,我会得到以下错误:

 proc = subprocess.Popen('echo "test"', cwd="~", shell=True,universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable="/bin/bash")
  File "/usr/lib/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.5/subprocess.py", line 1551, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '~'
我不确定我做错了什么,因为当您在cd命令中输入~时,它会将您刻录到主目录。我希望有人能找到解决办法 为什么它不能以这种方式工作,在主目录中启动它的正确方式是什么。

为了清晰起见,我简化了您的代码


使用Python 3.6或更高版本,您可以执行以下操作:

import subprocess, pathlib
subprocess.Popen(['echo',  'test'], cwd=pathlib.Path.home())
使用Python3.5,您需要将
Path.home()
包装成
str()

对于3.5以下的任何Python版本,您都可以使用:

import os, subprocess
subprocess.Popen(['echo',  'test'], cwd=os.path.expanduser('~'))
为了清晰起见,我简化了您的代码


使用Python 3.6或更高版本,您可以执行以下操作:

import subprocess, pathlib
subprocess.Popen(['echo',  'test'], cwd=pathlib.Path.home())
使用Python3.5,您需要将
Path.home()
包装成
str()

对于3.5以下的任何Python版本,您都可以使用:

import os, subprocess
subprocess.Popen(['echo',  'test'], cwd=os.path.expanduser('~'))

这是Python3.6还是更高版本?我使用的版本是3.5,我希望这会对没有包含此内容有所帮助。无需道歉——我在下面发布了一个解决方案。
~
由shell解释,但不是在
cwd=
参数中传递的。因为
cwd=
参数是在启动shell之前处理的。如果需要的话,您可以在cpython代码中看到它,特别是
Modules/\u posixsubprocess.c:child\u exec
函数。这听起来有点像一个函数。编写良好的软件通常不关心它在哪个目录下运行,覆盖用户当前的工作目录通常是一个不受欢迎的惊喜。这是python 3.6还是更高版本?我使用的版本是3.5,我希望这会有所帮助,因为没有包括这一版本。无需道歉——我在下面发布了一个解决方案。
~
由shell解释,但不是在
cwd=
参数中传递的。因为
cwd=
参数是在启动shell之前处理的。如果需要的话,您可以在cpython代码中看到它,特别是
Modules/\u posixsubprocess.c:child\u exec
函数。这听起来有点像一个函数。写得好的软件通常不关心它在哪个目录中运行,覆盖用户当前的工作目录通常是一个不受欢迎的惊喜。非常感谢,这就成功了,我不知道它甚至存在:)非常感谢,这就成功了,我不知道它存在:)